使用Ant编译源代码树的选择部分

时间:2011-08-12 22:15:27

标签: ant compilation target javac conditional-statements

我的情况有点儿有趣。我试图使用Ant来制作一个jar文件。但是,我不希望每个java文件都被编译。我的源代码有这样的结构:

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

所以,我想在jar文件中拥有的内容如下:

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

我不希望AnotherClass.Class在那里。

是否可以使用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>

我不认为我可以使用Ant来解决我的问题,因为我无法告诉Ant要编译什么,什么不能(我可以使用exclude和include)但是我想告诉Ant编译只有文件* .hbm.xml文件旁边。

3 个答案:

答案 0 :(得分:1)

我不知道如何使用Ant的内置selectors来实现这一点。

但是,如果您无法以任何其他方式解决此问题,则可以实现custom selector来检查.java文件是否具有相应的.hbm.xml文件,例如

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>

这只是基本的想法。 (我没有测试代码。)

更好的方法是避免构建中出现这种复杂的依赖关系。

答案 1 :(得分:0)

我认为你应该考虑将不同类型的类分成不同的项目。除了使您的打包过程更简单之外,还有其他好处:解耦,强制执行单向编译时依赖性等。

答案 2 :(得分:0)

假设Contact.java不依赖于AnotherClass.java,它是可行的。在javac标记中使用selector sub-elements(在“概念和类型”下的Ant文档中链接)。

以下是一个例子:

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

当然,您也可以直接使用<filename>子元素和属性代替patternset选择器:

    <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文件系统不区分大小写的文件系统,这可能无关紧要,但您仍应该这样做,以避免以后出现意外情况。)