简体   繁体   English

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

[英]Java + Gradle : Could not find or load main class

I'm trying to build and run a java project using Gradle.我正在尝试使用 Gradle 构建和运行 java 项目。
The project building succeeded.项目建设成功。 However, the error "Could not find or load main class ~" has occurred when running it.但是运行时出现“Could not find or load main class ~”的错误。
I found and tried a solution like this .我找到并尝试了这样的解决方案。 But the solution didn't work.但是解决方案没有用。

My project structure is here.我的项目结构在这里。

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

And my build.gradle file is here.我的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
}

The src/main/java/JavaAddressRecorder.java has main() and doesn't have package name. src/main/java/JavaAddressRecorder.javamain()而没有 package 名称。 The src/main/java/DbAddressRecorder.java and src/main/java/Geth.java are used from the main() . src/main/java/DbAddressRecorder.javasrc/main/java/Geth.javamain()使用。
So the ./gradlew build works without any errors, but java -jar JavaAddressRecorder-1.0-SNAPSHOT.jar doesn't work with the error below.因此./gradlew build没有任何错误,但java -jar JavaAddressRecorder-1.0-SNAPSHOT.jar不适用于以下错误。

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

I confirmed the JavaAddressRecorder is included the jar file like below.我确认JavaAddressRecorder包含在 jar 文件中,如下所示。

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

I'm a newbie to the Java language.我是 Java 语言的新手。
Anyone who knows how to solve this problem, please let me know.任何知道如何解决这个问题的人,请告诉我。

IDE: IntelliJ IDEA IDE:IntelliJ IDEA
OS: MacOS 11.6.8操作系统:MacOS 11.6.8
Java: Java(TM) SE Runtime Environment (build 17.0.5+9-LTS-191) Java:Java(TM) SE 运行时环境(构建 17.0.5+9-LTS-191)
Gradle: 7.5.1 Gradle:7.5.1

Add META-INF/MANIFEST.MF from the.jar file从.jar文件中添加META-INF/MANIFEST.MF

******** META-INF % cat MANIFEST.MF 
Manifest-Version: 1.0
Main-Class: JavaAddressRecorder

I found a solution that uses the shadowJar.我找到了一个使用 shadowJar 的解决方案。
The build.gradle is here. 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"
}

And run并运行

./gradlew shadowJar

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM