我有一个多项目构建,我在一个子项目中设置了一个任务来构建一个胖罐。我创建的任务类似于described in the cookbook。
jar {
from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
manifest { attributes 'Main-Class': 'com.benmccann.gradle.test.WebServer' }
}
运行它会导致以下错误:
原因:您无法更改 配置不在 尚未解决的状态!
我不确定这个错误意味着什么。 I also reported this on the Gradle JIRA in case it is a bug
答案 0 :(得分:157)
我在JIRA中针对Gradle发布了a solution:
// 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) }
}
}
答案 1 :(得分:60)
如果您希望jar
任务正常运行并且需要添加额外的fatJar
任务,请使用以下命令:
task fatJar(type: Jar) {
classifier = 'all'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
重要的部分是with jar
。没有它,这个项目的类不包括在内。
答案 2 :(得分:51)
@felix的回答几乎把我带到了那里。我有两个问题:
以下设置可解决此问题
jar {
manifest {
attributes(
'Main-Class': 'my.project.main',
)
}
}
task fatJar(type: Jar) {
manifest.from jar.manifest
classifier = 'all'
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
} {
exclude "META-INF/*.SF"
exclude "META-INF/*.DSA"
exclude "META-INF/*.RSA"
}
with jar
}
要将其添加到标准汇编或构建任务,请添加:
artifacts {
archives fatJar
}
编辑:感谢@mjaggard:在最近的Gradle版本中,将configurations.runtime
更改为configurations.runtimeClasspath
答案 3 :(得分:8)
这对我来说很好。
我的主要课程:
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
}
我在控制台中写下以下内容:
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
答案 4 :(得分:5)
要生成具有主可执行类的胖JAR,避免签名JAR的问题,我建议gradle-one-jar plugin。一个使用One-JAR project的简单插件。
易于使用:
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'
}
答案 5 :(得分:3)
@ben的答案几乎对我有用,除了我的依赖关系太大而且我得到了以下错误
Execution failed for task ':jar'.
> archive contains more than 65535 entries.
To build this archive, please enable the zip64 extension.
要解决此问题,我必须使用以下代码
mainClassName = "com.company.application.Main"
jar {
manifest {
attributes "Main-Class": "$mainClassName"
}
zip64 = true
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
答案 6 :(得分:2)
简单化解
jar {
manifest {
attributes 'Main-Class': 'cova2.Main'
}
doFirst {
from { configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } }
}
}
答案 7 :(得分:1)
排除不需要的清单条目修复了 Gradle 构建 jar 文件中未找到 MainClass 文件的错误。
jar{
exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'
from {
-----
}
}
答案 8 :(得分:1)
根据@blootsvoets 提出的解决方案,我以这种方式编辑了我的 jar 目标:
jar {
manifest {
attributes('Main-Class': 'eu.tib.sre.Main')
}
// Include the classpath from the dependencies
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
// This help solve the issue with jar lunch
{
exclude "META-INF/*.SF"
exclude "META-INF/*.DSA"
exclude "META-INF/*.RSA"
}
}
答案 9 :(得分:1)
由于使用 compile 列出依赖项现在已被弃用,并且所有人都应切换到实现,因此构建具有所有依赖项的 Jar 的解决方案应使用此网站中的示例。
https://docs.gradle.org/current/userguide/working_with_files.html#sec:creating_uber_jar_example
特别是这个命令:
configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it)
这里是完整的 gradle 部分: [1]:https://docs.gradle.org/current/userguide/working_with_files.html#sec:creating_uber_jar_example
task uberJar(type: Jar) {
archiveClassifier = 'uber'
from sourceSets.main.output
dependsOn configurations.runtimeClasspath
from {
configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
}}
答案 10 :(得分:0)
对于那些需要从项目中构建多个jar的人。
在gradle中创建函数:
void jarFactory(Jar jarTask, jarName, mainClass) {
jarTask.doFirst {
println 'Build jar ' + jarTask.name + + ' started'
}
jarTask.manifest {
attributes(
'Main-Class': mainClass
)
}
jarTask.classifier = 'all'
jarTask.baseName = jarName
jarTask.from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
{
exclude "META-INF/*.SF"
exclude "META-INF/*.DSA"
exclude "META-INF/*.RSA"
}
jarTask.with jar
jarTask.doFirst {
println 'Build jar ' + jarTask.name + ' ended'
}
}
然后致电:
task makeMyJar(type: Jar) {
jarFactory(it, 'MyJar', 'org.company.MainClass')
}
在gradle 5上工作。
瓶子将放在./build/libs
。
答案 11 :(得分:0)
我通过插件shadowJar
使用任务.
com.github.jengelman.gradle.plugins:shadow:5.2.0
用法仅运行./gradlew app::shadowJar
结果文件将位于MyProject/app/build/libs/shadow.jar
顶级build.gradle
文件:
apply plugin: 'kotlin'
buildscript {
ext.kotlin_version = '1.3.61'
repositories {
mavenLocal()
mavenCentral()
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.github.jengelman.gradle.plugins:shadow:5.2.0'
}
}
应用模块级别build.gradle
文件
apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'kotlin-kapt'
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'
sourceCompatibility = 1.8
kapt {
generateStubs = true
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.seleniumhq.selenium:selenium-java:4.0.0-alpha-4"
shadow "org.seleniumhq.selenium:selenium-java:4.0.0-alpha-4"
implementation project(":module_remote")
shadow project(":module_remote")
}
jar {
exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'
manifest {
attributes(
'Main-Class': 'com.github.kolyall.TheApplication',
'Class-Path': configurations.compile.files.collect { "lib/$it.name" }.join(' ')
)
}
}
shadowJar {
baseName = 'shadow'
classifier = ''
archiveVersion = ''
mainClassName = 'com.github.kolyall.TheApplication'
mergeServiceFiles()
}
答案 12 :(得分:0)
6.3版,Java库。运行“ 渐变构建”任务时,“ jar任务”中的代码将依赖项添加到“ build / libs / xyz.jar”中。
plugins {
id 'java-library'
}
jar {
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
答案 13 :(得分:0)
关于这种类型的解决方案有几点需要牢记:
task fatJar(type: Jar) {
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
只要您使用“编译”依赖项,它就可以工作。如果您使用“实现”依赖项,则它不起作用。
答案 14 :(得分:-1)
如果你已经习惯了蚂蚁,那么你也可以尝试使用Gradle:
task bundlemyjava{
ant.jar(destfile: "build/cookmyjar.jar"){
fileset(dir:"path to your source", includes:'**/*.class,*.class', excludes:'if any')
}
}