Mic*_*fel 5 java ant build-process
考虑以下项目布局(假设A和B相互依赖):
.
|-- bin1
|-- bin2
|-- src1
| `-- A.java
`-- src2
`-- B.java
Run Code Online (Sandbox Code Playgroud)
编译后,我希望这些类驻留在各自的文件夹中:
.
|-- bin1
| `-- A.class
|-- bin2
| `-- B.class
|-- src1
| `-- A.java
`-- src2
`-- B.java
Run Code Online (Sandbox Code Playgroud)
从命令行可以很简单:
$ javac -implicit:none -sourcepath src1:src2 -d bin1 src1/*
$ javac -implicit:none -sourcepath src1:src2 -d bin2 src2/*
Run Code Online (Sandbox Code Playgroud)
如果这样配置,Eclipse也会这样做.但我无法弄清楚如何用Ant做到这一点.
附录:我目前的javac任务:
<javac destdir="${classes.1.dir}">
<src path="${src.1.dir}" />
<src path="${src.2.dir}" />
</javac>
<javac destdir="${classes.2.dir}">
<classpath path="${classes.1.dir}" />
<src path="${src.2.dir}" />
</javac>
Run Code Online (Sandbox Code Playgroud)
注意循环依赖.在第二个任务的效果很好,它只是编译什么的src2,因为它有一个classpath在其他构建依赖.在第一个任务,但是,不能坐classpath,因为没有什么是尚未编制,并与src当然编译太多了.
我有同样的问题.我找到了一些非常简单的解决方案.
您只需要srcdir在javac任务中的属性中指定多个源foulders .而且你不应该指定destdir属性.
像这样的东西:
<javac srcdir="src1:src2" />
Run Code Online (Sandbox Code Playgroud)
所有二进制文件(.class文件)都将放在与源相同的位置.所以类文件的结构将完全相同.然后你可以将所有*.class移动到单独的位置,这样它们就不会存储在源代码中.
并没有像Kurt Kaylor那样的双重编译.
小智 2
这非常丑陋,需要一些清洁,但它应该能满足您的要求
<target name="compile" depends="clean,init" description="Compiles all source files.">
<mkdir dir="temp"/>
<javac srcdir="src1" sourcepath="src2" destdir="temp">
<classpath>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
</classpath>
</javac>
<javac srcdir="src2" sourcepath="src1" destdir="temp">
<classpath>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
</classpath>
</javac>
<javac srcdir="src1" destdir="bin1">
<classpath>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="temp"/>
</classpath>
</javac>
<javac srcdir="src2" destdir="bin2">
<classpath>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="temp"/>
</classpath>
</javac>
<delete dir="temp"/>
</target>
Run Code Online (Sandbox Code Playgroud)