我的情况有点有趣。我正在尝试使用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.xml
和include
中使用
<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文件系统那样不区分大小写的文件系统,那么这可能无关紧要,但您仍然应该这样做,以避免以后出现意外。