多个源文件夹:避免使用Ant进行隐式编译

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当然编译太多了.

Vit*_*ski 9

我有同样的问题.我找到了一些非常简单的解决方案.

您只需要srcdirjavac任务中的属性中指定多个源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)