2011-08-12 23 views
0

私の状況は何とか面白いです。 Antを使用してjarファイルを作成しようとしています。しかし、すべての単一のJavaファイルをコンパイルすることは望ましくありません。私のソースコードは、このような何かをstrcutureた:Antを使用してソースツリーの選択部分をコンパイル

src 
-Contact.Java 
-Contact.hbm.xml 
-AnotherClass.Java 

だから、私は私のjarファイルにしたいことは以下の通りである:

myjar.jar 
-com 
--me 
---Contact.Class 
---Contact.hbm.xml 

私はAnotherClass.Classはそこにする必要はありません。

Antではこれが可能ですか?

私が思い付く最高のは、このようなものです:私は私がコンパイルする何のAnt言わないと何ができないように私の問題を解決するためのAntを使用できるとは思わない

<target name="condition-hibernate" description="check if there is a java and hbm file then call for compile-hibernate"> 
    <condition property="condition"> 
    <available file="**/*.hbm.xml" /> 
    </condition> 

<antcall target="condition-hibernate-part2"/> 

</target> 

<target name="condition-hibernate-part2" description="check if there is a java and hbm file then call for compile-hibernate"> 
    <javac srcdir="${source.dir}" destdir="${hibernate.dir}"> 
</target> 

(I excludeとincludeを使用することができますが)Antのコンパイルには、その隣に* .hbm.xmlファイルがあることだけを伝えたいと思います。

+1

おそらくあなたの質問を少し言い直してください。つまり、対応する.hbm.xmlファイルを持つJavaクラスのみが必要であるとします。 – migu

答えて

1

私はAntの組み込みselectorsでこれを実現する方法がわかりません。

しかし、他の方法でこの問題を回避できない場合は、.javaファイルに対応する.hbm.xmlファイルがあるかどうかを確認するcustom selectorを実装することができます。

public class CorrespondingHbmSelector implements FileSelector { 
    public boolean isSelected(File basedir, final String filename, File f) { 
    Pattern p = Pattern.compile("^(.+).java$"); 
    Matcher m = p.matcher(filename); 
    boolean matches = m.matches(); 
    if (!matches) { 
     return false; 
    } 
    final String basename = m.group(1); 
    String[] foundFiles = basedir.list(new FilenameFilter() { 
     @Override 
     boolean accept(File dir, String name) { 
     return name.startsWith(basename) && name.endsWith(".hbm.xml"); 
     } 
    }); 
    return foundFiles.length > 0; 
    } 
} 

これは単なる基本的な考え方は、あなたのbuild.xml

includeよう
<typedef 
    name="correspondinghbmselector" 
    classname="CorrespondingHbmSelector" 
    classpath="${mydomain.classes}"/> 

<javac srcdir="${source.dir}" ...> 
    <correspondinghbmselector/> 
</javac> 

でそれを使用してください。 (私はコードをテストしませんでした)

より良い方法は、ビルドでこのような複雑な依存関係を避けることです。

+0

ああ、質問には、対応する '.hbm.xml'ファイルを持っている人だけが欲しいと私は理解していませんでした。しかし、意味をなさない。 –

+0

私はコードの複雑さに触れたくなければ、これが最善の解決策であると信じています。 – sheidaei

0

さまざまな種類のクラスを別々のプロジェクトに分けることを検討してください。デカップリング、片方向コンパイル時の依存関係などを

+0

私は最後にファイルを分けたので、私のために働いた。 – sheidaei

+0

よく聞いてください:) –

0

Contact.javaがAnotherClass.javaに依存しないと仮定すると、それは実行可能です。 javacタグのselector sub-elements(「概念とタイプ」のAntドキュメントにリンクされています)を使用してください。ここで

は一例です:もちろん

<javac srcdir="${source.dir}" destdir="${hibernate.dir}"> 
     <filename name="Contact.Java" /> 
    <javac> 

、代わりにあなたも直接patternsetサブ要素と属性を使用することができ<filename>セレクタの:

<javac srcdir="${source.dir}" destdir="${hibernate.dir}"> 
     <include name="Contact.Java" /> 
    <javac> 

または

<javac srcdir="${source.dir}" destdir="${hibernate.dir}" 
      includea="Contact.Java" /> 

ちなみに、Javaのファイル拡張子の命名規則は次のとおりです。小文字の文字(.java)のみを使用し、.Java(および.class)では使用できません。大部分のWindowsファイルシステムのように、大文字と小文字を区別しないファイルシステムを使用している場合は、これは問題ではありませんが、あとで驚きを避けるためにはそれを行う必要があります。)

+0

私は、ビルド時に知られていない、コンパイルする任意の数の.javaファイルがあると仮定しました。または、少なくともshahinはビルドファイルにそれらのすべてをリストしたくないでしょう。 – migu

+0

Contact.javaのような複数のクラスがあります。私が徹底的に説明しなければ、すみません。したがって、チェックする唯一の基準は、拡張子は同じですが同じfimenameを持つ共存クラスです。 あなたは大文字について正しいです、それは構造をタイプする間違いでした。それはすべて小文字です。 – sheidaei

関連する問題