我的情况有点儿有趣。我试图使用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文件旁边。
答案 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文件系统不区分大小写的文件系统,这可能无关紧要,但您仍应该这样做,以避免以后出现意外情况。)