[英]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.java
有main()
而没有 package 名称。 The src/main/java/DbAddressRecorder.java
and src/main/java/Geth.java
are used from the main()
. src/main/java/DbAddressRecorder.java
和src/main/java/Geth.java
从main()
使用。
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.