【问题标题】:Ant: How to force java compilation if classpath jars have changed but sources have notAnt:如果类路径 jar 已更改但源未更改,如何强制 java 编译
【发布时间】:2011-05-30 19:44:01
【问题描述】:


我有以下用例:
我有一个 java 项目(myProj),它使用来自不同项目(common)的 common.jar。我希望 javac ant 任务能够工作,即使 myProj 的来源没有改变如果 common.jar 已经改变(因为 myProj 的来源依赖于它并且现在可能无效)。
我的任务是将 common.jar 从中心位置复制到 myProj 库(如果它已更改),我可以使用它来设置属性是否“强制”编译,以便处理结束。
我不确定如何(或是否)我可以告诉 javac 任务尝试编译?我不想更改 myProj 的源(或时间戳)以便任务启动。
ant build.xml 文件摘录:

<path id="project.class.path">  
<pathelement location... />  
...  
<fileset dir="lib" includes="**/*.jar" />  
</path>  
<target name="copyLibs" >  
<copy file="${central.loc}/common.jar" todir="lib" />  
...  
</target>  
<target name="javac" >  
<javac srcdir="src" includes="**" excludes=... >  
<classpath refid="project.class.path"/>  
</javac>  
</target>  

提前致谢,
伊泰

【问题讨论】:

    标签: java ant jar classpath javac


    【解决方案1】:

    javac 之前使用delete 任务来清理旧的编译类:

    如果依赖类的 API 没有改变,一般不应该重新编译 java 类。

    另外我建议使用 maven,因为它可以更优雅地处理依赖关系。

    【讨论】:

    • @Vitaly 谢谢,我希望有一个更“内部”的解决方案,但我想这可以。我突然意识到我不知道如何检查 copy 是否真的移动了一个较新的 common.jar 文件。您是否介意我更新问题以包含此内容,或者您​​是否愿意我就如何执行该检查提出一个新问题?
    • 我建议再开一个,但这是你的电话
    • @Vitaly 谢谢,我已接受您的回答并在此处发布了另一个问题stackoverflow.com/questions/4533925/… 如果您认为您也可以帮助我,我将不胜感激
    • 如果您遵循 ANT 最佳实践,您的构建中将有一个 clean 目标,用于删除生成的构建工件。只需执行ant clean javac,或者您可以创建一个同时依赖于cleanjavac 的目标(例如clean-javac)。
    • @Mads 谢谢,但这意味着每次构建运行时都会编译所有类。这是我希望避免的。仅当源已更改或其中一个库已更改时,我才想编译类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多