当前位置: 首页 > 知识库问答 >
问题:

当当前程序有捆绑的jre时,如何运行另一个. jar文件?

王轶
2023-03-14

在用户需要安装jre才能运行aps之前:

ProcessBuilder builder = new ProcessBuilder("java -jar execute.jar");   

现在随着jlink和jpack的发布,可以使用捆绑的jre部署jars。

启动另一个的正确方法是什么。jar来自使用jlink/jpackage部署的程序

java-jar将无法工作,因为最终用户不再安装java

请参阅:如何从命令行调用嵌入式jre以运行java应用程序

这是一个类似的问题,但没有解决创建。带jlink/J包的jar

共有2个答案

年高洁
2023-03-14

如果必须在自己的JVM中运行第二个JAR,那么必须安装JRE或JDK才能运行。

或者,您需要使用jlinkjpack或其他任何东西将其变成一个独立的应用程序并分发它,而不是第二个JAR。用户必须将该应用程序安装在您的主应用程序可以找到的地方。

在任何一种情况下,都可以将第二个应用程序作为单独的进程运行;i、 e.作为一个单独的JVM。

如果可以在当前JVM中运行第二个JAR,那么可以执行以下操作:

  1. 打开JAR文件以读取其清单
  2. 获取主类和类路径的清单属性
  3. 使用包含第二个JAR及其所有依赖项的类路径创建一个新的类加载器。(这假设它们在类路径属性指定的位置可用。)
  4. 使用类加载器加载主类
  5. 使用反射查找并调用主类入口点方法;i、 e.静态void main(字符串[])方法。向其传递一个字符串[],以表示命令行参数

这种方法有几个问题。

>

  • 您从第2个JAR运行的应用程序将与您的主应用程序共享环境。相同的标准输入/输出/错误。相同的当前目录和环境变量。

    如果第二个应用程序行为不端...它可以以各种方式关闭主应用程序。安全沙盒可能会有所帮助,但它不会保护一切。

    如果主应用程序使用自定义JRE分发,那么它可能不包括第二个应用程序需要的所有JavaSE类。如果是这种情况,您将获得类加载器异常或错误。

    最后,如果使用的打包技术使用AOT编译器将主应用程序的所有类编译为本机代码,那么这种方法可能根本不起作用。

    更新-现在我知道你在这里实际做什么了(你有一个主应用程序和一个更新程序应用程序),我想还有另一种方法可以做到这一点。jlink实用程序允许您创建具有多个入口点的捆绑包。安装后,我希望它显示为具有不同名称的命令,这些命令是指向同一可执行html" target="_blank">文件的链接。他们(自然)会使用相同的嵌入式JRE。

    有关更多信息,请阅读以下内容:

    >

    对于jpack-打包工具用户指南:支持应用程序要求:添加启动器

    请注意,这样做可以解决捆绑JRE中缺少功能的可能问题。jlink或jpackage命令应确保包含所需的所有类/模块。

  • 鞠宏恺
    2023-03-14

    如果您定义了一个主类,您应该能够运行“java-jar HelloWorld.jar”。

    否则,您似乎可以创建一个指向启动模块的启动器。

    来自Redhat参考:https://access.redhat.com/documentation/en-us/openjdk/11/html/using_jlink_to_customize_java_runtime_environment/creating-custom-jre-modular

    为您的应用程序创建带有所需模块和自定义应用程序启动器的自定义JRE。

    $ ./jdk-11/bin/jlink --launcher hello=sample/sample.HelloWorld --module-path sample-module --add-modules sample --output custom-runtime
    $ ./custom-runtime/bin/hello
    
     类似资料:
    • 问题内容: 我有一个.jar文件,可以在命令行上运行: 我想将此.jar的输出另存为另一个Java程序内的String变量。 我该怎么做? 我尝试在程序中包含myFile.jar作为参考,并在程序中进行了操作。但这只是将结果打印到控制台,我无法在程序中使用结果。 希望这不会太令人困惑。 问题答案: 如果您不能包括另一个罐子, 你可以用这样的东西 我知道我的代码并不像捕获的异常那样完美,但是我认为这

    • 我从。jar文件创建了。exe文件。现在我的客户机要求运行应用程序而不在系统中安装jre。我听说使用捆绑的jre是可能的...但我不知道如何将jre与。exe文件捆绑...

    • 我正在使用maven和OpenJDK12在JavaFX中构建一个小应用程序。但是,我需要我的.jar包含一个捆绑的JRE,这样它就可以在windows OS上运行,而不需要下载适当的JRE。 Im也使用launch4j-maven-plugin 我在SOF上尝试了几种解决方案,但没有成功。一些主题提到了maven-shade-plugin,但它对我不起作用。我不能用它打包外部文件夹。 我现在的PO

    • 问题内容: 作为程序的一部分,我有一个连接管理器,该管理器从客户端接收连接,然后为客户端提供用于连接的端口号和密码。这时经理需要调用jar文件,我必须使用一些参数来处理此连接,然后继续操作(忽略其他程序在做什么)。 我的问题一直在执行jar文件。我查找了类似的问题,并尝试使用流程生成器和Runtime.exec。我在jar文件中移动,并检查了它的权限。它只是拒绝在另一个Java程序中工作,而在命令

    • 本文向大家介绍Java程序在另一个时区显示当前时间,包括了Java程序在另一个时区显示当前时间的使用技巧和注意事项,需要的朋友参考一下 要显示另一个时区的当前时间,请使用TimeZone类。要使用它,请导入以下软件包。 首先,设置时区。 现在,使用Calendar对象显示日期。 以下是最后一个示例。 示例 输出结果