Java + Gradle:无法找到或加载主类

kyks70gy  于 2023-01-13  发布在  Java
关注(0)|答案(1)|浏览(132)

我正在尝试使用Gradle构建和运行Java项目。
项目构建成功,但运行时出现“无法找到或加载主类~”错误。
我找到并尝试了一个类似this的解决方案,但该解决方案不起作用。
我的项目结构在这里。

javaAddressRecorder
├── build
│   ├── classes
│   │   └── java
│   │       └── main
│   │           ├── DbAddressRecorder.class
│   │           ├── Geth.class
│   │           └── JavaAddressRecorder.class
│   ├── generated
│   │   └── sources
│   │       ├── annotationProcessor
│   │       │   └── java
│   │       │       └── main
│   │       └── headers
│   │           └── java
│   │               └── main
│   ├── libs
│   │   └── JavaAddressRecorder-1.0-SNAPSHOT.jar
│   └── tmp
│       ├── compileJava
│       │   └── previous-compilation-data.bin
│       └── jar
│           └── MANIFEST.MF
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   ├── DbAddressRecorder.java
    │   │   ├── Geth.java
    │   │   └── JavaAddressRecorder.java
    │   └── resources
    └── test
        ├── java
        └── resources

我的build.gradle文件在这里。

plugins {
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
    implementation 'org.web3j:core:5.0.0'
    implementation 'org.slf4j:slf4j-simple:2.0.5'
    runtimeOnly 'mysql:mysql-connector-java:8.0.30'
}

test {
    useJUnitPlatform()
}

jar {
    manifest {
        attributes(
                'Main-Class': 'JavaAddressRecorder'
        )
    }
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
    duplicatesStrategy = DuplicatesStrategy.INCLUDE
}

src/main/java/JavaAddressRecorder.java具有main(),但没有软件包名称。src/main/java/DbAddressRecorder.javasrc/main/java/Geth.java是从main()使用的。
因此./gradlew build工作时没有任何错误,但java -jar JavaAddressRecorder-1.0-SNAPSHOT.jar不工作时出现以下错误。

Error: Could not find or load main class JavaAddressRecorder
Caused by: java.lang.ClassNotFoundException: JavaAddressRecorder

我确认了JavaAddressRecorder包含在jar文件中,如下所示。

******@****** libs % jar tf javaAddressRecorder-1.0-SNAPSHOT.jar | grep JavaAddressRecorder.class
JavaAddressRecorder.class

我是Java语言的新手。
任何知道如何解决这个问题的人,请告诉我。
集成开发环境:IntelliJ IDEA
操作系统:MacOS 11.6.8
Java:Java(TM)SE运行时环境(内部版本17.0.5+9-LTS-191)
等级:7.5.1

  • 从.jar文件添加元INF/清单.MF *
******** META-INF % cat MANIFEST.MF 
Manifest-Version: 1.0
Main-Class: JavaAddressRecorder
7z5jn7bk

7z5jn7bk1#

我找到了一个使用shadowJar的解决方案。
build.gradle在这里。

plugins {
    id 'java'
    id ("com.github.johnrengelman.shadow") version "7.1.2"
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
    implementation 'org.web3j:core:5.0.0'
    implementation 'org.slf4j:slf4j-simple:2.0.5'
    runtimeOnly 'mysql:mysql-connector-java:8.0.30'
}

test {
    useJUnitPlatform()
}

tasks.jar {
    manifest.attributes["Main-Class"] = "JavaAddressRecorder"
}

然后跑

./gradlew shadowJar

相关问题