首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过jpackage正确打包JavaFX + Spring应用程序?

如何通过jpackage正确打包JavaFX + Spring应用程序?
EN

Stack Overflow用户
提问于 2022-03-03 17:53:41
回答 1查看 396关注 0票数 0

我在用坏的jlink插件打包我的项目时遇到了麻烦。项目包含Spring Boot,它通过FXVeawerJavaFX一起工作。Spring Data应用程序与数据库一起工作。

我的build.gradle

代码语言:javascript
复制
plugins {
id 'org.springframework.boot' version '2.6.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.10'
id 'org.beryx.jlink' version '2.24.1'
}

group = 'spring.geodemo'
version = '0.1.7'
sourceCompatibility = '17'


application {
mainModule = 'spring.geodemo'
mainClass = 'spring.geodemo.GeoDemoApplication'
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter'

implementation 'javax.servlet:javax.servlet-api:4.0.1'
implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.17.2'


implementation group: 'org.springframework', name: 'spring-jdbc', version: '5.3.16'
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', 
version: '2.6.3'
implementation group: 'org.springframework', name: 'spring-core', version: '5.3.16'

implementation group: 'io.projectreactor.tools', name: 'blockhound', version: 
'1.0.6.RELEASE'


testImplementation 'org.springframework.boot:spring-boot-starter-test'

implementation 'net.rgielen:javafx-weaver-spring-boot-starter:1.3.0'
implementation 'org.postgresql:postgresql:42.3.1'
}

javafx {
version = '17.0.1'
modules = ['javafx.controls', 'javafx.fxml']
}

jlink {
imageZip = 
project.file("${buildDir}/distributions/app-${javafx.platform.classifier}.zip")
options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
launcher {
    name = 'Geo'
}

jpackage {
    forceMerge('log4j-api')
}
}

应用程序是打包的,但是由于错误,Caused by: org.springframework.cglib.core.CodeGenerationException: java.lang.IllegalAccessException-->module spring.geodemo does not open spring.geodemo to unnamed module @39cd0bac没有启动。

我不知道是什么导致了unnamed module @39cd0bac的出现。

源代码:论GitHub

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-03 21:03:36

解释错误

代码语言:javascript
复制
Caused by: org.springframework.cglib.core.CodeGenerationException: java.lang.IllegalAccessException
  module spring.geodemo does not open spring.geodemo to unnamed module @39cd0bac

看见

spring将cglib用于字节码操作,以支持核心spring任务(如依赖注入)。这需要模块化应用程序中的访问权限。cglib在类路径上运行,并试图在模块路径上操纵字节码。在当前运行时配置下,这种访问是受限的,不允许的。

目前不能使用jlink

Spring引导目前还没有配置为使用jlink的模块化构建,这在spring 3发布之前是不会发生的。

因此,您需要将应用程序打包为一个非模块化的应用程序,它运行于类路径之外,spring库也应该在类路径上。JavaFX库应该位于模块路径上。

要创建这样的构建,不要使用badass- jlink -plugin,因为jlink假定所有东西都是定义良好的非自动模块。因此,这在spring 2中是行不通的,它目前依赖于自动模块。

使用运行时插件和非模块化应用程序代替。

您的非模块化应用程序将在类路径上,以及与spring相关的库,如cglib,因此将不会出现访问错误。

在使用gradle和jpackage时,请使用坏蛋-运行时插件,它可以使用jpackage来打包非模块化的应用程序。

阅读、理解和应用其复杂的文档。

查看使用它的示例项目,特别是JavaFX应用程序示例,这些示例在其github站点中列出。

完全记录这个过程超出了StackOverflow答案的范围。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71341654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档