[英]Multiple source folders: Avoid implicit compilation with Ant
考慮以下項目布局(假設A和B相互依賴):
.
|-- bin1
|-- bin2
|-- src1
| `-- A.java
`-- src2
`-- B.java
編譯后,我希望這些類駐留在各自的文件夾中:
.
|-- bin1
| `-- A.class
|-- bin2
| `-- B.class
|-- src1
| `-- A.java
`-- src2
`-- B.java
從命令行可以很簡單:
$ javac -implicit:none -sourcepath src1:src2 -d bin1 src1/*
$ javac -implicit:none -sourcepath src1:src2 -d bin2 src2/*
如果這樣配置,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>
注意循環依賴。 第二個任務運行良好,它只編譯src2
因為它對另一個版本具有classpath
依賴性。 但是, 第一個任務不能采用classpath
,因為尚未編譯任何內容,並且使用src
它當然會編譯太多。
我有同樣的問題。 我找到了一些非常簡單的解決方案。
您只需要在javac
任務中的srcdir
屬性中指定幾個源foulders。 而且您不應該指定destdir
屬性。
像這樣的東西:
<javac srcdir="src1:src2" />
所有二進制文件(.class文件)都將放在與源相同的位置。 所以類文件的結構將完全相同。 然后你可以將所有* .class移動到單獨的位置,這樣它們就不會存儲在源代碼中。
並沒有像Kurt Kaylor那樣的雙重編譯。
這非常難看,需要一些清潔,但它應該做你想要的
<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>
在處理沒有重復編譯的復雜源代碼樹時,這對我有用。 關鍵是如何構建和引用路徑。
<path id="src.separate.java.path">
<pathelement path="separate-src1/java" />
<pathelement path="separate-src2/java" />
</path>
<property name="src.separate.java.path" refid="src.separate.java.path" />
<path id="src.java.path">
<pathelement path="src1/java" />
<pathelement path="src2/java" />
<pathelement path="src3/java" />
</path>
<property name="src.java.path" refid="src.java.path" />
<path id="src.java.all.path">
<path refid="src.separate.java.path" />
<path refid="src.java.path" />
</path>
<property name="src.java.all.path" refid="src.java.all.path" />
<target name="compile-java">
<mkdir dir="${separate.classes.dir}" />
<javac srcdir="${src.separate.java.path}" sourcepath="${src.java.all.path}" destdir="${separate.classes.dir}">
<classpath refid="project.class.path" />
<compilerarg value="-implicit:none"/>
</javac>
<mkdir dir="${build.classes.dir}" />
<javac srcdir="${src.java.path}" sourcepath="${src.java.all.path}" destdir="${build.classes.dir}">
<classpath refid="project.class.path"/>
<compilerarg value="-implicit:none"/>
</javac>
</target>
為了使其工作,源路徑需要由<pathelement>
。 如果使用<fileset>
,則javac的srcdir
屬性將阻塞路徑。 您還需要將路徑擴展為srcdir
和sourcepath
的屬性才能使用它。
所以srcdir
是編譯源代碼的路徑,而sourcepath
是編譯器需要解析引用的所有源代碼的路徑。 <compilerarg value="-implicit:none"/>
告訴編譯器不為隱式加載的源生成類文件。
當然,您可以使用javac中的嵌套<src>
元素而不是<path>
和<property>
的操作,但這會強制您列出兩次源路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.