【问题标题】:ANT compilation failsANT 编译失败
【发布时间】:2013-07-03 04:33:09
【问题描述】:

我是 ANT 新手。我有以下项目结构,

      Project
        module1
          build.xml
        module2
          build.xml
        lib

发生的情况是,我在模块 2 中配置了 build.xml 以构建模块 2 类的 JAR 并将其放在 lib 文件夹中。现在,我从 module1 的 build.xml 调用 module2 的 build.xml。 module1 需要 module2 的 JAR 才能编译。我可以在 lib 文件夹中看到 JAR,但模块 1 仍然没有编译。 有人可以帮帮我吗? 这是我的 build.xml 文件, 模块1 build.xml,

<?xml version="1.0" encoding="UTF-8"?>

<property name="app.name" value="module1" />
<property name="src.home" value="${basedir}/src/main/java" />
<property name="build.home" value="${basedir}/build" />
<property name="ear.home" value="${basedir}/ear" />
<property name="module2.home" value="../module2" />
<property name="external.lib.dir" value="../lib" />

    <path id="lib.path">
    <fileset dir="${external.lib.dir}">
        <include name="*.jar" />
    </fileset>
</path>

<path id="module2.path">
    <filelist dir="${module2.home}" />
</path>


<target name="clean">
    <delete dir="${build.home}" />
    <delete dir="${ear.home}" />

</target>
<target name="prepare" depends ="clean"
    description="Create build dirs and copy static files to work dir">
    <mkdir dir="${build.home}" />
    <mkdir dir="${build.home}/classes" />
</target>


<target name="compile" depends="prepare"
    description="Compile Java sources and copy to build/classes dir">

    <javac includeantruntime="false" srcdir="${src.home}" destdir="${build.home}/classes">
        <classpath refid="lib.path" />
    </javac>
    <copy todir="${build.home}/classes">
        <fileset dir="${src.home}" excludes="**/*.java" />
    </copy>
</target>
<target name="includeJar">
    <subant target="buildJar">
        <fileset dir="../module2/" includes="build.xml" />
    </subant>
</target>

<target name="buildEar" depends="includeJar,compile">
            <jar destfile="${basedir}/ear/${app.name}.ear" basedir="${build.home}" />
</target>

这里是module2 build.xml,

<?xml version="1.0" encoding="UTF-8"?>
<project name="module2">    
<property name="app.name"      value="module2"/>
<property name="src.home"      value="${basedir}/src/main/java"/>
<property name="build.home" value="${basedir}/build"/>
<echo>
    module2 build.xml
</echo>
<target name="clean">
    <delete dir="${build.home}"/>
</target>
<target name="init" depends="clean"
          description="Create build dirs and copy static files to work dir">

    <mkdir  dir="${build.home}"/>
    <mkdir  dir="${build.home}/classes"/>      
  </target>


<target name="compile" depends="init"
          description="Compile Java sources and copy to build/classes dir">
    <javac includeantruntime="false" srcdir="${src.home}"
          destdir="${build.home}/classes">

    </javac>
    <copy  todir="${build.home}/classes">
      <fileset dir="${src.home}" excludes="**/*.java"/>
    </copy>
  </target>

<target name="buildJar" depends="compile">
    <echo>Inside buildJar of module2
            </echo>
    <jar destfile="../lib/${app.name}.jar"
         basedir="${build.home}"
         />
  </target>

【问题讨论】:

  • 请发布 build.xml 文件以便更好地了解可能发生的情况
  • 编辑了我的帖子以包含 build.xml 文件
  • @Mark - 现在可以使用了。在下面发布了更改。谢谢你:)

标签: java ant build


【解决方案1】:

会出现 module1 没有编译,因为 module2 创建的 jar 没有被构建。

您正在调用子任务,但未指定目标:

<subant target="buildJar">
    <fileset dir="../module2/" includes="build.xml" />
</subant>

module1 构建文件没有指定默认目标:

<?xml version="1.0" encoding="UTF-8"?>
<project name="module2">    
..
..

我推荐的解决方案是指定一个默认目标,如下所示:

<project name="module2" default="buildJar">    

一边

多模块构建支持和依赖管理是融入更现代 Java 构建工具的功能。如果您尝试在 ANT 中构建一个大型项目,请考虑了解 ivy plugin 的工作原理。

【讨论】:

  • 即使在模块 2 中提供默认值后,我也会收到相同的错误。还有一点需要注意的是,module2 的 build.xml 中的所有 echo 都被执行了,我在 lib 文件夹中看到了 jar。
  • 我交叉检查了 JAR 文件,它包含所需的类文件。 module1 build.xml 即使独立运行也会引发编译错误。在执行 ANT 之前,我将 module2 jar 复制到 lib。
【解决方案2】:

解决了这个问题。我忽略了一个愚蠢的错误。这是我所做的更改, module2 的 build.xml, 1.我做了以下更改, 将 jar 的 basedir 从 basedir="${build.home}" 更改为 basedir="${build.home}/classes" module1 的 build.xml。 2. 对 buildEar 目标进行了与上述类似的更改。 我能够成功生成 EAR :)

感谢马克抽出宝贵时间:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2021-10-07
    • 1970-01-01
    • 2021-02-02
    • 2021-06-14
    • 2021-01-29
    • 2018-11-06
    相关资源
    最近更新 更多