使用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的回答几乎把我带到了那里。 我有两个问题:

  1. 在Gradle 1.5中,manifest标签在fatJar任务中没有被识别,所以不能直接设置Main-Class属性
  2. 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') } }