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



我的情况有点有趣。我正在尝试使用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编译什么和不编译什么(我可以使用排除和包含),但我想告诉Ant只编译那些有*.hbm.xml文件旁边的文件。

我不知道如何使用Ant的内置选择器实现这一点。

然而,如果你不能解决这个问题,你可以实现一个自定义选择器,检查.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.xmlinclude中使用

<typedef
  name="correspondinghbmselector"
  classname="CorrespondingHbmSelector"
  classpath="${mydomain.classes}"/>
<javac srcdir="${source.dir}" ...>
  <correspondinghbmselector/>
</javac>

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

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

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

假设Contact.java不依赖于AnotherClass.java,这是可行的。在你的javac标签中使用选择器子元素(在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文件系统那样不区分大小写的文件系统,那么这可能无关紧要,但您仍然应该这样做,以避免以后出现意外。

相关内容

  • 没有找到相关文章

最新更新