我在用坏的jlink插件打包我的项目时遇到了麻烦。项目包含Spring Boot,它通过FXVeawer与JavaFX一起工作。Spring Data应用程序与数据库一起工作。
我的build.gradle
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
发布于 2022-03-03 21:03:36
解释错误
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答案的范围。
https://stackoverflow.com/questions/71341654
复制相似问题