首页 > 解决方案 > 使用 gradle jar 文件查找主类时出现问题

问题描述

我见过很多人在使用 Gradle 制作 jar 文件时出现“无法找到或加载主类”错误。我浏览了许多论坛,但还没有找到适合我的解决方案。根据在线教程,我能够在 VSCode 中设置 Gradle 项目并为基本的 hello world 程序添加依赖项。链接到我在此处关注的教程:https ://www.youtube.com/watch?v= BwdkyrnJQsg 这对我来说没问题,但是当我完成更大的程序时,它找不到我的 Main.class 文件。这是我的 build.gradle 文件:

plugins {
    id 'java'
    id 'java-library'
    id 'application'
}

application
{
    mainClass = 'Main'
}

java
{
    sourceCompatibility = JavaVersion.VERSION_12
    targetCompatibility = JavaVersion.VERSION_12
}

project.configurations.implementation.setCanBeResolved(true);
version = '1.0.0'
mainClassName = 'Main'

sourceSets
{
    main 
    {
        java
        {
            srcDirs 'src/main/java'
        }
    }
}

repositories
{
    mavenCentral()
    maven
    {
        url = 'https://licensespring-maven.s3.eu-central-1.amazonaws.com/'
    }
}

dependencies
{
    implementation 'com.licensespring:licensespring-license-client:2.1.0'
    // https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
    implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '4.0.0-alpha-6'
    // https://mvnrepository.com/artifact/net.harawata/appdirs
    implementation group: 'net.harawata', name: 'appdirs', version: '1.2.0'
    // https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform
    implementation group: 'net.java.dev.jna', name: 'jna-platform', version: '5.6.0'
    // https://mvnrepository.com/artifact/net.java.dev.jna/jna
    implementation group: 'net.java.dev.jna', name: 'jna', version: '5.6.0'
    // https://mvnrepository.com/artifact/org.slf4j/slf4j-api
    implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.0-alpha1'
    // https://mvnrepository.com/artifact/commons-io/commons-io
    implementation group: 'commons-io', name: 'commons-io', version: '2.7'
}

jar
{
    manifest
    {
        attributes(
            "Main-Class": "$mainClassName",
            "Class-Path": configurations.implementation.collect {it.name}.join(' ')
        )
    }
    dependsOn('dependencies')
    from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}

src/main/java/我的 Main.java 文件中,我有 main 方法以及所有其他 .java 文件。当我运行时gradlew clean build,我的.class文件显示在build/classes/java/main. 只是为了澄清,当我运行时,java -jar './build/libs/myApplication.jar'我得到了Could not find or load main class Main错误。如果您需要更多细节,请告诉我。

更新:再次切换到 Intellij,我收到涉及主要清单属性的错误。我检查了输出的 jar,Manifest 文件确实已打包,并且确实具有 Main Manifest 属性。请帮帮我!

标签: javavisual-studio-codebuild.gradlegradlew

解决方案


我有类似的问题来创建可运行的 jar。我可以通过以下示例解决它

解决方案 1:创建一个包含所有依赖项的胖 jar。

task fatJar(type: Jar) {
 manifest {attributes 'Main-Class': 'com.example.gradle.App'}
 from {
       configurations.compile.collect
       { it.isDirectory() ? it : zipTree(it) }
 }with jar
}

解决方案 2:创建一个可运行的 jar,并将依赖项复制到目录并设置类路径

def dependsDir = "${buildDir}/libs/dependencies/"
task copyDependencies(type: Copy) {
   from configurations.compile
   into "${dependsDir}"
}

task createJar(dependsOn: copyDependencies, type: Jar) {
   manifest {
      attributes(
       'Main-Class': 'com.example.gradle.App',
       'Class-Path': configurations.compile.collect
             { 'dependencies/' + it.getName() }.join(' ')
      )}
     with jar
}

通过此处的示例了解更多信息


推荐阅读