[英]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.