这是how to execute a built fat JAR as a gradle task?的后续问题 我没有足够的观点来问我的问题作为评论。所以我必须再问一次。这个问题已多次被其他格式和场景询问过,但这些回应都没有帮助我。如何用gradle创建的fatJar中的主要方法执行一个类
我的问题:
场景1:创建使用的gradle fatJar依赖性的单罐
方案2:使用行家组件创建具有相关性的单一罐
执行
java -cp sample.jar com.example.ClassA
这两个进程中生成的jar文件。
问题:从过程1 罐子给我
错误:无法找到或从过程2正确执行加载主类com.example.ClassA
罐子。
我已经提取了两个jar文件,并且它们都具有相同的文件夹结构和相同的文件 - 表示编译后的类文件存在于两个jar文件中。
我没有在任何进程中指定任何清单条目,因为我有多个主类,而且我没有尝试生成可执行的jar文件。
我的build.gradle文件看起来像如下:
apply plugin: 'java'
apply plugin: 'maven'
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenLocal()
}
sourceSets {
main{
java{
srcDirs 'src/main/java'
}
}
}
processResources {
from 'src/main/resources'
}
task compile (type: JavaCompile) {
source = sourceSets.main.java.srcDirs
include '**/*.java'
classpath = sourceSets.main.compileClasspath
destinationDir = sourceSets.main.output.classesDir
}
compile.options.compilerArgs = ["-sourcepath", "$projectDir/src/main/java"]
dependencies {
.
.
.
}
task fatJar(type:Jar) {
baseName = 'xxxxxxx'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
defaultTasks 'clean', 'compile', 'fatJar'
编辑 - 1:
我试图相对路径罐子,绝对路径罐子,甚至浏览到包含文件夹罐子里。没有任何运气。
我试过使用'/'而不是'。'。在包名中。那里也没有运气。
我已经尝试使用Java虚拟机参数提供足够大的堆空间。纳达。
试图在PowerShell上执行。得到以下错误:
+ CategoryInfo : NotSpecified: (Error: Could not lo...ClassA:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
我想直接看到内容使用jar -tvf path_to_jar \ sample.jar。有趣的是,jar命令没有执行并且抱怨在类路径中没有找到命令。我不得不浏览到java安装目录并执行命令并显示文件内容。
我在这里没有想法和选择。 任何指针?
@ 2194470我看到情侣您所做的与我的场景之间的差异。 1.我在Windows上测试,你可能在Mac上做过。我认为这与这个问题没有任何关系。 2.我使用简单的“gradle”命令执行fatJar,并使用“graddew”包装器命令。我会试试这个,让你知道。顺便说一句,在执行fatJar时使用gradle和gradlew有什么区别吗? –
我几乎可以肯定你的问题是由于你在'java -cp ...'命令中传递的JAR文件的错误路径导致的。尝试首先将绝对路径传递给此文件。由于JVM引发此错误,因此Windows/Linux差异不应该成为问题。使用'gradlew'与本地安装的'gradle'相比没有区别 - 我使用它主要是因为它更容易与其他版本的Gradle分享。 –
用额外的评论编辑这个问题,你能再次检查它吗? –