带有罐子目标的蚂蚁

Ant with Jar Target

我需要帮助,了解用ant打包jar的问题。这是我的简单代码:

  <target name="build" depends="compile,test">
    <jar 
        basedir="${bin}/swing.gui"
        destfile="${mod}/swing.gui.jar">
      <manifest>
        <attribute name="Main-Class" value="swing.main.Main"/>
      </manifest>
    </jar>
  </target>

这个小程序是模块化的,正如你所看到的,模块swing.gui应该被打包在一个jar文件中。这里的问题是,当我尝试使用以下命令启动模块时:

java --module-path bin/mod --module swing.gui

它不起作用。错误消息说没有 MainClass 属性,我应该尝试 -m / 代替。 当我在控制台上执行这一行时:

jar --create --file=bin/mod/swing.gui.jar --main-class=swing.main.Main -C bin/src/swing.gui .

它很管用!这是蚂蚁中的错误吗?

完全不是错误。 Ant 只是按照您的指示去做。

模块加载器不使用 Main-Class 清单属性。 jar--main-class 选项与清单无关;它在 jar 的模块-info.class 条目上设置二进制 class 属性。

因此,您的 Ant 构建文件正在执行与您的 jar 命令完全不同的操作。

直到 Ant 的 任务直接支持这个,解决方法是直接调用 JDK 的 jar 命令。像这样:

<condition property="exec-suffix" value=".exe" else="">
    <os family="windows"/>
</condition>

<property name="jar.tool"
          location="${java.home}/bin/jar${exec-suffix}"/>

<exec executable="${jar.tool}" failonerror="true">
    <arg value="-u"/>
    <arg value="-f"/>
    <arg file="${mod}/swing.gui.jar"/>
    <arg value="-e"/>
    <arg value="swing.main.Main"/>
</exec>