JDK17,xjar打包成功,容器运行错误

JDK8升级到JDK17之后,打包xjar成功,但是在容器中运行错误

错误日志:

Exception in thread "main" java.lang.reflect.InaccessibleObjectException: Unable to make field private final jdk.internal.loader.URLClassPath java.net.URLClassLoader.ucp accessible: module java.base does not "opens java.net" to unnamed module @6f29c911
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
        at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
        at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
        at io.xjar.reflection.XReflection.field(XReflection.java:20)
        at io.xjar.boot.XBootClassLoader.<init>(XBootClassLoader.java:41)
        at io.xjar.boot.XJarLauncher.createClassLoader(XJarLauncher.java:31)
        at org.springframework.boot.loader.ExecutableArchiveLauncher.createClassLoader(ExecutableArchiveLauncher.java:109)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:55)
        at io.xjar.boot.XJarLauncher.launch(XJarLauncher.java:26)
        at io.xjar.boot.XJarLauncher.main(XJarLauncher.java:22)
panic: exit status 1
goroutine 1 [running]:
main.main()
        /usr/local/product/xjar.go:86 +0x545

找到原因:

出现这个错误的原因是 JDK9 往后引入了Java Platform Module System(模块化)这个概念,每个模块都是强封装的,而我们启动 JAR 包需要用到反射去访问目标类,这里提示没有权限;那我们只能在命令里增加参数,来特定打开某些需要打开的包才能正常启动项目,下面的命令增加了启动参数,JAR 包可以正常执行。

根据报错信息分析

上面的异常需要的参数就是(ALL-UNNAMED代表所有jdk编译出来的匿名类):
--add-exports java.base/jdk.internal.loader=ALL-UNNAMED
--add-exports java.base/java.net=ALL-UNNAMED
--add-exports java.base/java.lang=ALL-UNNAMED

加入命令解决:

./xjar java --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED -jar ./xxx.xjar

参考博客:http://t.csdn.cn/IafR4

JDK 17中,可以使用JavaFX来打包可执行文件(exe)。下面是打包exe的步骤: 1. 配置JDK 17:确保你的系统中已经正确安装了JDK 17,并且配置了系统变量。 2. 配置JavaFX:在JDK 17中,JavaFX已经被移除,需要单独下载并配置。你可以从OpenJFX官方网站下载JavaFX,并将其解压到一个目录中。 3. 配置项目:在你的项目中,确保已经正确配置了JavaFX的依赖项。这可以通过在项目的构建文件(如pom.xml或build.gradle)中添加相应的依赖项来实现。 4. 打包jar文件:使用构建工具(如Maven或Gradle)将你的项目打包成一个可执行的jar文件。你可以使用以下命令来执行打包操作: - Maven:`mvn clean package` - Gradle:`gradle clean build` 5. 打包exe文件:使用第三方工具(如Launch4j或JPackage)将jar文件打包成exe文件。这些工具可以将jar文件与Java运行时环境(JRE)捆绑在一起,以便在没有安装JRE的计算机上运行。以下是使用Launch4j和JPackage的示例: - 使用Launch4j: - 下载并安装Launch4j。 - 打开Launch4j,并配置以下参数: - Output file:指定生成的exe文件的输出路径和名称。 - Jar:选择你之前打包jar文件。 - JRE:选择你想要捆绑的JRE版本。 - 保存配置并点击“Build”。 - 使用JPackage: - 打开命令行终端,并导航到你的项目目录。 - 运行以下命令: ```shell jpackage --input <path_to_jar_file> --main-jar <main_class> --output <output_directory> --name <app_name> --win-shortcut --win-menu --win-dir-chooser ``` 其中: - `<path_to_jar_file>`:你之前打包jar文件的路径。 - `<main_class>`:你的应用程序的主类。 - `<output_directory>`:生成的exe文件的输出目录。 - `<app_name>`:生成的exe文件的名称。 请注意,以上步骤中的参数和工具选择可能因你的具体需求而有所不同。你可以根据自己的情况进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值