通过 jpackage 打包找不到或加载主类

Posted

技术标签:

【中文标题】通过 jpackage 打包找不到或加载主类【英文标题】:Packaging via jpackage Could not find or load main class 【发布时间】:2021-10-09 22:30:38 【问题描述】:

使用 jpackage 我无法让 pkg 在 macOS 上运行。安装按预期进行,但是当我启动已安装的应用程序时,它会立即停止。

尝试通过 CLI 启动它并抛出

Error: Could not find or load main class com.example.Application
Caused by: java.lang.ClassNotFoundException: com.example.Application

我已将MainClass 参数作为com.example.Application 传递,我可以在Contents/app/example.jar 下的已安装包中看到它。

使用 Gradle 插件 id "org.panteleyev.jpackageplugin" version "1.3.1" 构建原生安装程序:

def os = org.gradle.internal.os.OperatingSystem.current()
def pkgType = os.windows ? 'msi' : os.linux ? 'deb' : 'pkg'
def inputDir = "$buildDir/input"

task copyDependencies (type: Copy) 
    from configurations.runtimeClasspath
    into inputDir


task copyJar (type: Copy) 
    from tasks.jar
    into inputDir


jpackage 
    dependsOn clean
    dependsOn bootJar
    dependsOn copyDependencies
    dependsOn copyJar

    type = pkgType

    input = inputDir
    destination = "$buildDir/dist"

    appName = 'Example'
    vendor = 'com.example'

    mainJar = tasks.jar.getArchiveFileName().get()
    mainClass = 'com.example.Application'

    javaOptions = ['-Dfile.encoding=UTF-8']

当通过 IntelliJ/通过 CLI 启动时,jar 运行良好。

我还需要在这里做什么?

【问题讨论】:

【参考方案1】:

由于我正在尝试运行 Springboot 应用程序,因此诀窍是不要像通常那样尝试启动主类,而是使用 org.springframework.boot.loader.JarLauncher

Spring 团队在 blog post 中对此进行了更恰当的解释

所以一个完整的 Springboot 工作示例如下所示:

plugins 
    id 'org.springframework.boot' version '2.6.0-SNAPSHOT'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'org.panteleyev.jpackageplugin' version '1.3.1'

    id 'application'


group = 'space.forloop'
version = '1.0.6'

compileJava.options.encoding = 'UTF-8'
compileTestJava.options.encoding = 'UTF-8'
javadoc.options.encoding = 'UTF-8'


repositories 
    mavenCentral()
    maven  url 'https://repo.spring.io/milestone' 
    maven  url 'https://repo.spring.io/snapshot' 


dependencies 
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'


configurations 
    compileOnly 
        extendsFrom annotationProcessor
    


java 
    toolchain 
        languageVersion = JavaLanguageVersion.of(17)
    


application 
    mainClass = 'com.example.Application'
    applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"]


bootJar 
    manifest 
        attributes 'Implementation-Version': "$project.version"
        attributes 'Implementation-Title': "$project.name"
    


// Not required but useful if you want to configure a little more.
def os = org.gradle.internal.os.OperatingSystem.current()
def pkgType = os.windows ? 'msi' : os.linux ? 'deb' : 'pkg'

jpackage 
    dependsOn "bootJar"

    type = pkgType

    input = "$buildDir/libs"
    destination = "$buildDir/dist"

    appName = 'Example'
    vendor = 'com.example'

    mainJar = bootJar.archiveFileName.get()
    mainClass = "org.springframework.boot.loader.JarLauncher"

    javaOptions = ['-Dfile.encoding=UTF-8']

    macPackageName = bootJar.archiveBaseName.get()

【讨论】:

以上是关于通过 jpackage 打包找不到或加载主类的主要内容,如果未能解决你的问题,请参考以下文章

idea打包jar,运行错误: 找不到或无法加载主类

myeclipse 下执行mian函数报类找不到主函数

运行java文件显示找不到或无法加载主类怎么解决?

maven target 怎么运行 找不到或无法加载主类

Spring Boot gradle“找不到或加载主类”

java运行显示“找不到或无法加载主类