我有一个运行的JAR本的build.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)
当gradle build
运行时,摇篮建立任务和任何任务取决于它(通过声明dependsOn
)。 如果不设置build.dependsOn(copyToLib)
摇篮将不会与生成任务副本任务关联。
所以:
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)
我找到应用程序插件的方式太麻烦,并在其输出太冗长。 下面是我终于得到了一个安装我很高兴的,即建立在子目录依赖罐子分布zip文件/lib
和所有依赖添加到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
}
托管的要点在这里 。
结果可以发现build/distributions
及解压缩后的内容是这样的:
LIB /公地lang3-3.3.2.jar
与myJarFile.jar
内容MyJarFile.jar#META-INF/MANIFEST.mf
:
清单-版本:1.0
主类:com.somepackage.MainClass
类路径:LIB /公地lang3-3.3.2.jar
该应用程序插件需要您设置主类名是这样的:
mainClassName = "com.test.HelloWorld"
你需要的是添加到您的构建脚本。 请记住,如果你尝试运行与应用程序java
命令,你也将需要设置与类路径-cp
。
该应用程序插件提供的任务简化了这一过程distZip 。 如果您运行的任务你一个完整的分布是你下创建build/distributions
。 该发行版包括启动脚本和所有的依赖。 所生成的启动脚本已经设置classpath中给你,让你不必再处理它。