使用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文件和其他所有.java文件,以及main方法和main方法。运行gradlew clean build时,我的.class文件显示build/classes/java/main下。 为了澄清,我在运行java -jar './build/libs/myApplication.jar'时遇到了Could not find or load main class Main错误。让我知道是否需要更多详细信息。

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

解决方法

您可以尝试提供main的源集和完整软件包名称吗? 它应该看起来像这样:

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

project.configurations.implementation.setCanBeResolved(true)

jar{
    manifest {
        attributes(
                "Main-Class": "com.xyz.Main","Class-Path":  configurations.implementation.collect { it.name }.join(' ')
        )
    }
    dependsOn ('dependencies')
}
,

创建可运行jar时遇到类似问题。我可以用下面的例子解决它

解决方案1:创建一个具有所有依赖项的胖子。

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
}

通过示例here

进一步了解

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...