2013-12-22 132 views
12

我有一个基于gradle的独立项目。当我进行gradle构建时,jar会在build/libs下生成。我如何从命令行运行这个可执行的jar文件?我尝试过:java -cp build/libs/foo.jar full.package.classname但我得到noClassFoundException为导入的类。如何将依赖的jar包含为classpath的一部分?运行基于gradle项目构建的可执行jar文件

+2

如果你有一个可执行的jar只使用java -jar path-to-jar-file – Satya

+0

考虑使用应用程序插件。请参阅http://www.gradle.org/docs/current/userguide/application_plugin.html – Jayan

+0

@Satya我无法加载主类清单属性错误。当我使用gradle(gradle run -DmainClass = )运行它时,它将所有jar(来自〜/ .gradle/caches目录)添加为classpath的一部分。是否有任何其他方式只使用构建的jar文件进行操作? – coder

回答

8

由于问题标记为gradle标记,我假设你想从gradle构建中运行jar。我还假设你使用java插件来为你的gradle构建。

添加下一行的gradle产出:

task runFinalJar(type: JavaExec) { 
    classpath = files('build/libs/foo.jar') 
    classpath += sourceSets.main.runtimeClasspath 
    main = full.package.classname 
} 

现在,您可以包括你的任务是构建过程:

build.dependsOn.add("runFinalJar") 

或者只是运行它形成的命令行:

gradle build runFinalJar 

UPDATE Peter建议使用应用程序插件更清洁

+0

其实我可以从gradle build中成功运行它。我会使用gradle build来创建一个jar文件,并且这个jar会被部署在不一定安装gradle的生产环境中。所以问题是如何运行这个jar? Gradle在内部包含所有依赖jar(来自〜/ .gradle目录)作为classpath的一部分。所以我想知道是否有任何方法可以轻松地使用jar文件。 – coder

+0

'gradlew'将帮助您安装gradle –

+0

我不想在prod环境中安装gradle。但我发现了一个工作。通过编写一个简单的Gradle任务,我能够将我的项目的所有依赖jar添加到一个目录中。现在,我的jar和它的依赖jar被放在一个目录中:〜/ myproject/build/libs。如果我做java -cp *。jar 我在我的主类中得到一个NoClassDefinedException。我验证了我的项目的jar是在同一个目录下,并且还有主类。我错过了什么? – coder

4

可以使用application plugin创建一个包含代码,其依赖关系和启动脚本的存档,或者创建一个可执行的fat jar。后者不应该以天真的方式完成,而应该使用gradle-one-jar(或类似的插件)。

+4

这个答案可以通过告诉读者如何识别“天真的方式”来改进,例如,使用'from {configurations.compile.collect {it.isDirectory() ?it:zipTree(it)}}用jar'一个天真的方式? –

+0

是的,这是正确的。 –

2

我认为答案超出了实际问题的范围。现在的问题是,或者可以重申,如何运行gradle构建的JAR。

提问者声明他们已经尝试java -cp build/libs/foo.jar full.package.classname无济于事。

正确的语法是java -jar build/libs/foo.jar,或者如果JAR在那里,显然它通常只是java -jar foo.jar

这个问题应该编辑清晰,恕我直言。

相关问题