簡體   English   中英

多個源文件夾:避免使用Ant進行隱式編譯

[英]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屬性將阻塞路徑。 您還需要將路徑擴展為srcdirsourcepath的屬性才能使用它。

所以srcdir是編譯源代碼的路徑,而sourcepath是編譯器需要解析引用的所有源代碼的路徑。 <compilerarg value="-implicit:none"/>告訴編譯器不為隱式加載的源生成類文件。

當然,您可以使用javac中的嵌套<src>元素而不是<path><property>的操作,但這會強制您列出兩次源路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM