为什么ant认为包不存在?

时间:2013-07-19 13:14:15

标签: java ant classpath javac

我有以下目录结构:

MyApp/
    src/main/java/
        com/
            myapp/
                api/
                    IFizz
                    FizzLoader
                impl/
                    core/
                        FizzImpl
                    Cat
                    Dog
                    Tree
                    ...many other objects
    src/test/java
        ...
    build/
    lib/
    ...

我只想编译src/main/java/com/myapp/api 以及 com.myapp.impl.core.FizzImpl下的所有内容,以便CatDogTree等等不要编译(因而被排除在外)。

在Ant build(build.xml)中,我配置了以下main.compile.path

<path id="src.path">
    <fileset dir="src/main/java/com/myapp/api">
        <include name="**.*java"/>
    </fileset>
</path>
<path id="lib.main.path">
    <fileset dir="lib/main">
        <include name="**/*.jar"/>
    </fileset>
</path>
<path id="main.compile.path">
    <path refid="src.path" />
    <path refid="lib.main.path" />
    <fileset dir="src/main/java" includes="com/myapp/impl/core/**/*" />
</path>

然后是以下main-compile目标:

<target name="main-compile">
    <javac includeantruntime="false" srcdir="src/main/java/com/myapp/api"
            destdir="gen/bin/main" debug="on">
        <classpath refid="main.compile.path"/>
    </javac>
</target>

当我运行main-compile时,我得到以下构建异常:

[javac] /home/myuser/eclipse/workspace/MyApp/src/main/java/com/myapp/api/FizzLoader.java:14: package com.myapp.impl.core does not exist
[javac] import com.myapp.impl.core.FizzImpl;
[javac]  ...(omitting rest of trace but available upon request)

这里,FizzLoader正在创建FizzImpl的实例,因此我需要在编译路径上使用它。

为什么Ant没有看到我有选择地添加到com.myapp.impl.core.FizzImpl的{​​{1}}?提前谢谢!

1 个答案:

答案 0 :(得分:1)

javac的类路径应该引用包含已编译类文件树根的目录和jar文件。它不应该引用Java文件。

同样,源目录应该引用源文件的包树的根。不在包树中包含与包对应的目录。

您的编译任务应该类似于

<target name="main-compile">
    <javac includeantruntime="false" 
           srcdir="src/main/java"
           destdir="${gen.bin.main.dir}" 
           debug="on"
           includes="com/myapp/api/**/*.java, com/myapp/impl/core/FizzImpl/**/*.java">
        <classpath refid="lib.main.path"/>
    </javac>
</target>