java - 使用 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 文件中,我有 main 方法以及所有其他 .java 文件。当我运行时gradlew clean build
,我的.class
文件显示在build/classes/java/main
. 只是为了澄清,当我运行时,java -jar './build/libs/myApplication.jar'
我得到了Could not find or load main class Main
错误。如果您需要更多细节,请告诉我。
更新:再次切换到 Intellij,我收到涉及主要清单属性的错误。我检查了输出的 jar,Manifest 文件确实已打包,并且确实具有 Main Manifest 属性。请帮帮我!
解决方案
我有类似的问题来创建可运行的 jar。我可以通过以下示例解决它
解决方案 1:创建一个包含所有依赖项的胖 jar。
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
}
通过此处的示例了解更多信息
推荐阅读
- wordpress - 从 Live WordPress 迁移到 Localhost 后,得到“不允许访问页面”
- c# - 在 Xamarin 中的 UI 和代码模块之间传递值的最佳方式
- python - Atom 中的“脚本”在哪里?
- angular - 是否可以以角度突出显示文本?
- android - 使用 Retrofit2 时总是调用 OnFailure 方法
- mysql - 将 MySQL 表数据实时提供给 ElasticSearch 的最佳方式是什么?
- c# - 字符串和串口输入的比较总是假的
- javascript - 搜索域:odoo 中的多个条件
- javascript - 使用通用导航菜单浏览多个页面时出错
- javascript - 为什么带有 React 框架的 Office.js 在带有普通 Javascript 的 Office.js 工作时会破坏端点数据