使用Gradle构build一个具有依赖关系的jar
我有一个多项目构build,我把一个任务,在其中一个子项目中build立一个胖jar子。 我创build了类似于食谱中描述的任务。
jar { from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } manifest { attributes 'Main-Class': 'com.benmccann.gradle.test.WebServer' } }
运行它会导致以下错误:
原因:您不能更改未处于未解决状态的configuration!
我不确定这个错误是什么意思。 我也在Gradle JIRA上报告过,以防它是一个bug 。
我在JIRA上发布了一个针对Gradle 的解决scheme :
// Include dependent libraries in archive. mainClassName = "com.company.application.Main" jar { manifest { attributes "Main-Class": "$mainClassName" } from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } }
如果您希望jar
任务正常运行并添加一个fatJar
任务,请使用以下命令:
task fatJar(type: Jar) { baseName = project.name + '-all' from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } with jar }
重要的部分是with jar
。 没有它,这个项目的类不包括在内。
@felix的回答几乎把我带到了那里。 我有两个问题:
- 在Gradle 1.5中,manifest标签在fatJar任务中没有被识别,所以不能直接设置Main-Class属性
- jar与外部的META-INF文件有冲突。
以下设置解决了这个问题
jar { manifest { attributes( 'Main-Class': 'my.project.main', ) } } task fatJar(type: Jar) { manifest.from jar.manifest classifier = 'all' from { configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } } { exclude "META-INF/*.SF" exclude "META-INF/*.DSA" exclude "META-INF/*.RSA" } with jar }
要将其添加到标准汇编或构build任务,请添加:
artifacts { archives fatJar }
要生成一个带有主要可执行类的胖JAR,避免签名JAR的问题,我build议使用gradle-one-jar插件 。 一个简单的插件,使用One-JAR项目 。
使用方便:
apply plugin: 'gradle-one-jar' buildscript { repositories { mavenCentral() } dependencies { classpath 'com.github.rholder:gradle-one-jar:1.0.4' } } task myjar(type: OneJar) { mainClass = 'com.benmccann.gradle.test.WebServer' }
这对我来说很好。
我的主课:
package com.curso.online.gradle; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; public class Main { public static void main(String[] args) { Logger logger = Logger.getLogger(Main.class); logger.debug("Starting demo"); String s = "Some Value"; if (!StringUtils.isEmpty(s)) { System.out.println("Welcome "); } logger.debug("End of demo"); } }
这是我的文件build.gradle的内容:
apply plugin: 'java' apply plugin: 'eclipse' repositories { mavenCentral() } dependencies { compile group: 'commons-collections', name: 'commons-collections', version: '3.2' testCompile group: 'junit', name: 'junit', version: '4.+' compile 'org.apache.commons:commons-lang3:3.0' compile 'log4j:log4j:1.2.16' } task fatJar(type: Jar) { manifest { attributes 'Main-Class': 'com.curso.online.gradle.Main' } baseName = project.name + '-all' from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } with jar }
我在控制台中input以下内容:
java -jar ProyectoEclipseTest-all.jar
而输出是伟大的:
log4j:WARN No appenders could be found for logger (com.curso.online.gradle.Main) . log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more in fo. Welcome
简单的污染
jar { manifest { attributes 'Main-Class': 'cova2.Main' } doFirst { from { configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } } } }
如果你习惯了ant,那么你也可以尝试与Gradle一样:
task bundlemyjava{ ant.jar(destfile: "build/cookmyjar.jar"){ fileset(dir:"path to your source", includes:'**/*.class,*.class', excludes:'if any') } }