Java 使用ant仅编译部分源代码树

Java 使用ant仅编译部分源代码树,java,ant,jar,javac,Java,Ant,Jar,Javac,假设我在src/树中(可能在test/树中)有我的源代码。假设我只想编译该树的一部分。我想这样做的原因是多方面的。举个例子,我可能希望创建尽可能最小的jar(不包括某些类),或者我可能希望编译的内容具有最快的编译时间。不过,我绝对想编译所有的依赖项 这可以通过以下命令行轻松实现: javac -d build/ -cp whatever -sourcepath src src/path/to/MyClass.java 现在,你怎么能用ant做到这一点?javac-ant: 源目录和目标目录 将

假设我在src/树中(可能在test/树中)有我的源代码。假设我只想编译该树的一部分。我想这样做的原因是多方面的。举个例子,我可能希望创建尽可能最小的jar(不包括某些类),或者我可能希望编译的内容具有最快的编译时间。不过,我绝对想编译所有的依赖项

这可以通过以下命令行轻松实现:

javac -d build/ -cp whatever -sourcepath src src/path/to/MyClass.java
现在,你怎么能用ant做到这一点?javac-ant:

源目录和目标目录 将递归扫描Java 要编译的源文件

可以使用
排除
包含
参数,但它们在这方面存在问题。事实上,似乎必须明确地设置所有的
包括
(不是自动依赖项查找),并且甚至最坏的

当包含和排除同时存在时 已使用,仅文件/目录 至少匹配一个包含项 模式和不匹配的任何 使用排除模式

因此,您不能使用

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
            excludes="**/*.java" includes="src/path/to/MyClass.java" />  
即使依赖项使它编译(远不止一个)源文件。

实际上,ant只检查所有内容,如果您连续运行两次编译,您会发现第二次编译要快得多。事实上,它很容易被说服错过一些东西


如果你甚至不想它考虑所有的事情,你就必须把它分解成更小的模块/项目/源树,这样你就明确地告诉蚂蚁要编译什么。

为什么你排除了,也包括了?如果您至少有一个include,则仅当文件显式包含时才编译它们。因此,这应该是可行的:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
        includes="src/path/to/MyClass.java" />

或更灵活地:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
    <include name="src/path/to/MyClass.java"/>
    <include name="src/path/to/AnotherClass.java"/>
</javac>

要在jar中只包含某些包或类,请使用fileset属性

<jar jarfile="${outlib}/something.jar">
    <fileset dir="${build.dir}">
        <include name='src/path/to/classes' />
    </fileset>
</jar>


同样,您可以使用多个包含来组合单独的包。尝试使用includes和,你一定会找到你需要的答案。

只需给出你想要构建的文件的逗号分隔列表。让我们举个例子

<property name="includeFileList" value="<name of java class>.java"/>

<javac srcdir="${src.dir}" destdir="${build.dir}"
       target="1.6" debug="true" includes="${includeFileList}"/>


它会起作用。

这是一个老问题,但我一直在努力解决同样的问题,并找到了一个更优雅的解决方案。因此,以下内容仅供将来参考:

根据ant文档,
元素是一个隐式的
,因此可以像
一样使用,因此只能编译MyClass.java:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
  <filename name="**/path/to/MyClass.java"/>
</javac>


如果要创建最小的JAR,请在任务中创建;它具有所有必要的属性。如果您想要最快的编译时间。。。好吧,用Java编译总是只需要几秒钟,我看不出你在这里能得到多少。专注于更有用的东西!这取决于你的项目有多大。我发现当一个项目超过600或700个类时,编译速度开始明显减慢,我不得不尝试以某种方式将其拆分。@Vladimir Dyuzev-这并没有回答OP的问题。请参阅我在上述问题中的完整评论
<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
  <filename name="**/path/to/MyClass.java"/>
</javac>