java - Ant 与 jar 目标

标签 java module jar ant

我需要帮助,以了解使用 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 中的错误吗?

最佳答案

确切地说,不是错误。 Ant 只是做你让它做的事。

模块加载器不使用Main-Class list 属性。 jar--main-class 选项与 list 无关;它在 jar 的 module-info.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>

关于java - Ant 与 jar 目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60365587/

相关文章:

java - 如何从 JAR 文件执行脚本?

localization - OSGi bundle 结构是什么?

java - 尝试创建 jar 文件时未找到文件异常

java - ThreadLocal 跨线程取值

java - 通过 Gradle 进行测试时的日志记录

Java多线程 - 如何制作线程序列?

javascript - Node/npm : How to manage globally installed devDependencies

java - Spring mvc - 将 xml 文本字符串发送到 Controller

c++ - 减少 cpp 翻译单元的数量是个好主意吗?

python - Py_FindMethod 在 python3 中消失了。我应该用什么代替?