运行从基于gradle的项目构建的可执行jar文件

cod*_*der 19 java jar gradle

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

Eug*_*nov 14

由于问题用gradle标记标记,我假设你想从gradle build运行jar.我还假设您使用java插件进行gradle构建.

在你的gradle中添加下一行:

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

您现在可以将任务包含在构建过​​程中:

build.dependsOn.add("runFinalJar")
Run Code Online (Sandbox Code Playgroud)

或者只需从命令行运行它:

gradle build runFinalJar
Run Code Online (Sandbox Code Playgroud)

更新如Peter建议的那样使用应用程序插件更清晰

  • 实际上我可以从gradle构建中成功运行它.我将使用gradle构建创建一个jar文件,这个jar将部署在生产环境中,该环境不一定安装了gradle.所以问题是如何运行这个jar?Gradle内部包含所有依赖jar(来自〜/ .gradle目录)作为classpath的一部分.所以我想知道有没有办法只用jar文件轻松做到这一点. (2认同)

Pet*_*ser 7

使用应用程序插件创建包含代码,依赖项和启动脚本的存档,或创建可执行的胖Jar.后者不应该以天真的方式完成,而应该使用gradle-one-jar(或类似的)插件.

  • 通过告诉读者如何识别"天真的方式",可以改善这个答案.例如,使用`from {configurations.compile.collect {it.isDirectory()?它:zipTree(it)}}与jar`一种天真的方式? (7认同)

Syl*_*ain 6

添加一个简单的任务来运行jar

task runJar(type: JavaExec) {
    main = "-jar";
    args jar.archivePath
}
Run Code Online (Sandbox Code Playgroud)


Thu*_*fir 5

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

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

正确的语法是java -jar build/libs/foo.jar,或者如果 JAR 就在那里,显然它java -jar foo.jar和往常一样。

恕我直言,为了清楚起见,应该编辑问题。