[英]Making a runnable big jar with gradle and shadow
我想用 gradle 为我的测试项目制作一个可运行的 jar。 (使用 java -jar jajson.jar)。
这是我的文件树:
-src
--JaJon.java
--Student.java
build.gradle
gson-2.8.8.jar
这是我的JaJson.java :
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class JaJson {
public static void main(String args[]) {
System.out.println("Hello");
String jsonString = "{\"name\":\"Mahesh\", \"age\":21}";
GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
Gson gson = builder.create();
Student student = gson.fromJson(jsonString, Student.class);
System.out.println(student);
jsonString = gson.toJson(student);
System.out.println(jsonString);
}
public JaJson(){
System.out.println("what time is it ?");
}
public void getTime(){
System.out.println("Hammer time!");
}
}
这是我的Student.java :
public class Student {
private String name;
private int age;
public Student(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student [ name: "+name+", age: "+ age+ " ]";
}
}
实际上,当我执行以下操作时它会起作用:
javac -cp gson-2.8.8.jar;*.jar;src; src/JaJson.java
然后是:
java -cp gson-2.8.8.jar;*.jar;src; JaJson
它按预期显示我:
Student [ name: Mahesh, age: 21 ]
{
"name": "Mahesh",
"age": 21
}
所以这是我用 gradle 制作一个可运行的胖罐子的混乱尝试,其中包含 gson 和 Student 类:
构建.gradle
apply plugin: 'java'
apply plugin: 'eclipse'
//apply plugin: 'java-library'
apply plugin: 'application'
apply plugin: 'idea'
buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath 'gradle.plugin.com.github.jengelman.gradle.plugins:shadow:7.0.0'
}
}
apply plugin: 'com.github.johnrengelman.shadow'
mainClassName = "JaJson"
// tag::repositories[]
repositories {
mavenCentral()
}
// end::repositories[]
configurations {
// configuration that holds jars to include in the jar
extraLibs
}
sourceSets {
single{
java {
srcDir 'src'
}
}
}
task compile(type: JavaCompile) {
source = sourceSets.single.java
sourceSets.main.java.srcDirs = ['src']
classpath = sourceSets.main.compileClasspath
destinationDirectory = sourceSets.main.output.classesDirs[0]
}
compileJava {
options.release = 7
}
// tag::dependencies[]
dependencies {
implementation 'com.google.code.gson:gson:2.8.8'
implementation "joda-time:joda-time:2.2"
testImplementation "junit:junit:4.12"
shadow 'com.google.code.gson:gson:2.8.8'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(11)
}
}
jar {
manifest {
attributes(
'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
'Main-Class': 'JaJson'
)
}
}
task fatJar(type: Jar) {
manifest.from jar.manifest
classifier = 'all'
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
} {
exclude "META-INF/*.SF"
exclude "META-INF/*.DSA"
exclude "META-INF/*.RSA"
}
with jar
}
shadowJar {
archiveBaseName.set('shadow')
archiveClassifier.set('')
archiveVersion.set('')
manifest {
inheritFrom project.tasks.fatJar.manifest
}
}
version = '1.2.1'
关于如何与学生和 gson 一起做一个可运行的 fatjar 的任何想法?
问候
添加两个依赖
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
}
使用 Java 插件中的 Jar 任务
我们需要做两件事才能让它工作:
让我们对 Gradle 任务添加一些修改:
jar {
manifest {
attributes "Main-Class": "com.baeldung.fatjar.Application"
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
创建单独的任务
如果我们想保留原来的 jar 任务,我们可以创建一个单独的任务来完成相同的工作。
以下代码将添加一个名为 customFatJar 的新任务:
task customFatJar(type: Jar) {
manifest {
attributes 'Main-Class': 'com.baeldung.fatjar.Application'
}
baseName = 'all-in-one-jar'
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
使用专用插件
我们还可以使用现有的 Gradle 插件来构建一个胖 jar。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1'
}
}
apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'
一旦我们应用了Shadow plugin
, shadowJar
任务就可以使用了。
有关更多详细信息,请查看此链接
使用 gradle 7.2,我能够使用gradle build
(或./gradlew build
如果您使用 gradle 包装器)命令创建可执行的胖 jar,只需从问题中的build.gradle
中删除一行。 我从jar
任务的attributes
方法中删除了'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
line。
使用命令java -jar build/libs/shadow.jar
运行生成的 fat jar 返回以下响应:
Hello
Student [ name: Mahesh, age: 21 ]
{
"name": "Mahesh",
"age": 21
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.