【问题标题】:How to create a jar file with an Ant script to launch the program [duplicate]如何使用 Ant 脚本创建 jar 文件以启动程序 [重复]
【发布时间】:2013-04-30 08:42:03
【问题描述】:

我目前有一个包含两个主要方法的 eclipse 项目,我想知道是否可以创建一个 jar 文件,该文件在执行 jar 文件时运行 Apache Ant 脚本。我在下面提供了一个 Ant 脚本,其中运行了两个主要方法。提前致谢。

    <?xml version="1.0"?>
      <project name="Test" default="run_external">
        <target name="compile">
            <delete dir="bin" />
            <mkdir dir="bin" />
            <javac srcdir="src" destdir="bin" />
        </target>
        <target name="run_external" depends="compile">
            <parallel>
                <exec executable="cmd" dir="bin">
                    <arg value="/c start cmd.exe /k java test.Main" />
                </exec>
                <exec executable="cmd" dir="bin">
                    <arg value="/c start cmd.exe /k java test.Main2" />
                </exec>
            </parallel>
        </target>
    </project>

【问题讨论】:

  • 你到底想达到什么目的?
  • 当我运行 jar 文件 so java -jar file.jar 时,我希望 jar 运行启动原始帖子中指定的两个主要方法的 ant 脚本
  • 你为什么不创建一个可执行的jar,然后调用类文件的主要方法,而不是调用一个ant脚本来执行这些方法。如果你需要我可以给你一个例子
  • @NullPointerException 是的,请你提供一个例子。
  • @user1087943 添加了答案

标签: java apache ant jar main


【解决方案1】:

为什么需要 Ant?从评论中我推断您希望您的 Java 程序启动另一个程序。如果是这样,只需使用:

Runtime.getRuntime().exec("java -jar otherprogram.jar");

或任何命令行。请注意,Runtime.getRuntime().exec() 有更高级的版本,请查看 javadoc。

编辑:来自Runtime.getRuntime().exec() docs:

在单独的进程中执行指定的字符串命令。

所以你正在生成另一个独立的 JVM。

不要直接使用java ...,而是使用环境变量编写命令:这只是为了演示功能。

无论如何,如果你需要在启动时这样做,我建议你使用一个shell脚本来启动这三个程序。

【讨论】:

  • 对造成的混乱表示歉意。我正在寻找在单独的 JVM 和控制台上相互独立启动的所有 Java 程序。因此,这就是我使用 Ant 脚本的原因。我想在运行 Jar 文件时执行 ant 脚本,这将生成多个其他命令行,其中运行特定的 jar 文件。
  • 如果您使用Runtime.exec(),则会生成一个不同的进程(以及JVM)。检查上面的编辑。
【解决方案2】:

使用 ant 创建一个 jar

 <target name="jar" depends="compile">
    <mkdir dir="${jar.dir}"/>
    <jar destfile="${jar.dir}/helloworld.jar" basedir="${classes.dir}"/>
 </target>

当您在一个 jar 文件中包含多个主类时,必须使用 -cp 标志调用每个主类并指定主类的完全限定名称。

java -cp helloworld.jar com.test.Main1 && java -cp helloworld.jar com.test.Main2

这会给你一个输出(我只是打印了类名)

I am main 1
I am main 2

或者 根据您的要求,您可以创建单个入口点(我更喜欢这个),我的意思是一个带有 main 方法的类,然后从这个类中调用其他 main 方法

例子

创建一个类

public class Main {

public static void main(String[] args) {

    Main1.main(args);
    Main2.main(args);
   }
 }

在 Manifest.MF 中包含这个主类

<target name="jar" depends="compile">
    <mkdir dir="${jar.dir}"/>
     <jar destfile="${jar.dir}/helloworld.jar" basedir="${classes.dir}">
        <manifest>
            <attribute name="Main-Class" value="com.test.Main"/>
        </manifest>
    </jar>
</target>

并执行

   java -jar helloworld.jar

这个的输出

 I am main 1
 I am main 2

【讨论】:

  • OP 希望程序“在不同的 JVM 和控制台上相互独立启动”。
猜你喜欢
  • 1970-01-01
  • 2013-05-30
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多