问题描述
我已经看到许多人在用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
进一步了解