2017-08-02 25 views
1

这是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安装目录并执行命令并显示文件内容。

我在这里没有想法和选择。 任何指针?

回答

0

看起来您的执行命令无效。以建设项目后:

./gradlew clean fatJar 

你应该使用下面的命令来运行你的程序:

java -cp build/libs/xxxxxxx.jar com.example.ClassA 

参数-cp build/libs/xxxxxxx.jar设置classpath中JVM是即将开始,它必须指向现有的JAR文件(您可以使用该文件的相对路径或绝对路径)。

看看下面的截屏我录的几分钟前:

你可以看到,如果我改变执行命令:

java -cp xxxxxxx.jar com.example.ClassA 

我完全与您的相同错误:

Error: Could not find or load main class com.example.ClassA 

在这里您可以找到simple Gradle project我曾经玩过你的build.gradle文件的例子。我已经添加了一个依赖关系来证明fatJar构建了一个依赖关系的JAR,并且我添加了与public static void main(String[] args)的类来证明您可以从命令行选择任何主类。我希望它有帮助。

+0

@ 2194470我看到情侣您所做的与我的场景之间的差异。 1.我在Windows上测试,你可能在Mac上做过。我认为这与这个问题没有任何关系。 2.我使用简单的“gradle”命令执行fatJar,并使用“graddew”包装器命令。我会试试这个,让你知道。顺便说一句,在执行fatJar时使用gradle和gradlew有什么区别吗? –

+0

我几乎可以肯定你的问题是由于你在'java -cp ...'命令中传递的JAR文件的错误路径导致的。尝试首先将绝对路径传递给此文件。由于JVM引发此错误,因此Windows/Linux差异不应该成为问题。使用'gradlew'与本地安装的'gradle'相比没有区别 - 我使用它主要是因为它更容易与其他版本的Gradle分享。 –

+0

用额外的评论编辑这个问题,你能再次检查它吗? –

0

由于某些原因,无论我使用哪种配置来使用fatJar,最终的jar在尝试执行主类时都会出错。

使用ShadowJar任务我能够构建必要的jar并执行问题中指定的主类。

我知道这打破了关于使用fatJar和执行主类的问题的全部目的。但由于时间限制,我不得不寻找替代品。

对于那些谁正在寻找配置的阴影罐的任务,我做到了用下面:

buildscript { 
    repositories { 
     mavenLocal()  
     dependencies { 
      classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3' 
     } 
    } 
} 


apply plugin: 'com.github.johnrengelman.shadow' 

,最终执行任务,我用

gradle shadowJar 
相关问题