繁体   English   中英

用 gradle 和 shadow 制作一个可运行的大罐子

[英]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 任务

我们需要做两件事才能让它工作:

  • 清单文件中的 Main-Class 属性
  • 包含依赖 jars

让我们对 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 pluginshadowJar任务就可以使用了。

有关更多详细信息,请查看此链接

使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM