我使用此build.gradle获得了一个可运行的jar
apply plugin: 'java'
apply plugin: 'application'
manifest.mainAttributes("Main-Class" : "com.test.HelloWorld")
repositories {
mavenCentral()
}
dependencies {
compile (
'commons-codec:commons-codec:1.6',
'commons-logging:commons-logging:1.1.1',
'org.apache.httpcomponents:httpclient:4.2.1',
'org.apache.httpcomponents:httpclient:4.2.1',
'org.apache.httpcomponents:httpcore:4.2.1',
'org.apache.httpcomponents:httpmime:4.2.1',
'ch.qos.logback:logback-classic:1.0.6',
'ch.qos.logback:logback-core:1.0.6',
'org.slf4j:slf4j-api:1.6.0',
'junit:junit:4.+'
)
}
但它运行失败,因为依赖项jar无法找到。
然后我添加此代码:
task copyToLib(type: Copy) {
into "$buildDir/output/libs"
from configurations.runtime
}
但没有变化......我找不到文件夹输出/ libs ...
如何将依赖项libs jar复制到指定的文件夹或路径?
答案 0 :(得分:39)
添加:
build.dependsOn(copyToLib)
当gradle build
运行时,Gradle会构建任务以及依赖它的任何任务(由dependsOn
声明)。如果不设置build.dependsOn(copyToLib)
,Gradle将不会将复制任务与构建任务相关联。
所以:
apply plugin: 'java'
apply plugin: 'application'
manifest.mainAttributes("Main-Class" : "com.test.HelloWorld")
repositories {
mavenCentral()
}
dependencies {
compile (
'commons-codec:commons-codec:1.6',
'commons-logging:commons-logging:1.1.1',
'org.apache.httpcomponents:httpclient:4.2.1',
'org.apache.httpcomponents:httpclient:4.2.1',
'org.apache.httpcomponents:httpcore:4.2.1',
'org.apache.httpcomponents:httpmime:4.2.1',
'ch.qos.logback:logback-classic:1.0.6',
'ch.qos.logback:logback-core:1.0.6',
'org.slf4j:slf4j-api:1.6.0',
'junit:junit:4.+'
)
}
task copyToLib(type: Copy) {
into "$buildDir/output/libs"
from configurations.runtime
}
build.dependsOn(copyToLib)
答案 1 :(得分:15)
我发现应用程序插件在输出中过于繁琐且过于冗长。这是我最终得到一个我很满意的设置,即在子目录/lib
中创建一个包含依赖项jars的分发zip文件,并将所有依赖项添加到清单文件中的Class-Path
条目:
apply plugin: 'java'
apply plugin: 'java-library-distribution'
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.commons:commons-lang3:3.3.2'
}
// Task "distZip" added by plugin "java-library-distribution":
distZip.shouldRunAfter(build)
jar {
// Keep jar clean:
exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'
manifest {
attributes 'Main-Class': 'com.somepackage.MainClass',
'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
}
// How-to add class path:
// http://stackoverflow.com/questions/22659463/add-classpath-in-manifest-using-gradle
// https://gist.github.com/simon04/6865179
}
作为要点here。
结果可以在build/distributions
中找到,解压缩的内容如下所示:
lib / commons-lang3-3.3.2.jar
MyJarFile.jar
MyJarFile.jar#META-INF/MANIFEST.mf
的内容:
清单 - 版本:1.0
Main-Class:com.somepackage.MainClass
Class-Path:lib / commons-lang3-3.3.2.jar
答案 2 :(得分:1)
应用程序插件要求您设置主类名称,如下所示:
mainClassName = "com.test.HelloWorld"
您需要将其添加到构建脚本中。请记住,如果您尝试使用java
命令运行应用程序,则还需要使用-cp
设置类路径。
应用程序插件通过提供任务distZip简化了此过程。如果您运行该任务,则会在build/distributions
下为您创建完整分发。分发包含启动脚本和所有依赖项。生成的启动脚本已经为您设置了类路径,因此您不必再处理它了。
答案 3 :(得分:0)
从Gradle 6.0开始,它是:
tasks {
val deps by registering(Copy::class) {
from(configurations.runtimeClasspath)
into("build/deps")
}
}
答案 4 :(得分:0)
java
插件可以打包具有依赖项的jar,并且不需要application
插件。像下面这样的任务会做:
task buildWithDeps(type: Jar) {
manifest {
attributes "Main-Class": "com.test.HelloWorld"
}
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
答案 5 :(得分:0)
至少从Gradle 5.6.4开始,您将需要做一些更接近此的事情。
getCats:
handler: catCrud.getCats
module: src/functions/catCrud
events:
- http:
path: /cat
method: get
authorizer:
name: authorizeFunc
identitySource: method.request.header.Authorization
type: token