Gradle Shadow插件与Java 17

简介

Gradle Shadow插件是一个常用的Gradle构建工具插件,用于将所有项目依赖打包到一个可执行的JAR文件中。它可以解决构建过程中的依赖冲突问题,并使生成的JAR文件更加便携和独立。而Java 17是最新的Java版本,带来了许多新特性和改进。本文将介绍如何在Gradle项目中使用Shadow插件,并结合Java 17进行构建和打包。

安装Gradle

首先,确保已经安装了Gradle。可以在命令行输入以下命令来检查Gradle的版本:

gradle --version

如果没有安装Gradle,可以在[Gradle官网](

Gradle Shadow插件

Gradle Shadow插件可以通过在build.gradle文件中添加相应的配置来使用。首先,需要在plugins部分添加id 'com.github.johnrengelman.shadow' version '7.1.0',如下所示:

plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '7.1.0'
}

接下来,在shadowJar部分可以进行更多的配置。例如,可以设置生成的JAR文件的名称:

shadowJar {
    archiveFileName = 'myapp.jar'
}

可以设置主类,指定程序入口:

shadowJar {
    mainClassName = 'com.example.MyApp'
}

还可以排除一些不需要打包的依赖:

shadowJar {
    exclude 'javax.servlet:javax.servlet-api'
}

更多配置选项可以在[Gradle Shadow插件官方文档](

使用Java 17

Java 17引入了许多新特性,如Sealed类、Pattern匹配、Switch表达式的增强等。在使用Gradle构建Java项目时,我们可以指定使用Java 17来编译和运行代码。

首先,在项目的build.gradle中添加以下配置:

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}

这样Gradle就会使用Java 17来编译项目。接下来,可以在tasks部分添加一个运行项目的任务:

task run(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    main = 'com.example.MyApp'
}

这个任务将使用Java 17运行com.example.MyApp类。可以使用以下命令运行项目:

gradle run

示例项目

下面我们来创建一个简单的Java项目,并使用Gradle Shadow插件和Java 17进行构建和打包。

首先,创建一个名为myapp的文件夹,并在其中创建以下文件结构:

myapp
├── src
│   ├── main
│   │   └── java
│   │       └── com
│   │           └── example
│   │               └── MyApp.java
│   └── test
│       └── java
│           └── com
│               └── example
│                   └── MyAppTest.java
└── build.gradle

MyApp.java中编写一个简单的Java类:

package com.example;

public class MyApp {
    public static void main(String[] args) {
        System.out.println("Hello, Gradle Shadow!");
    }
}

MyAppTest.java中编写一个简单的测试类:

package com.example;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class MyAppTest {
    @Test
    public void test() {
        assertEquals(2, 1 + 1);
    }
}

接下来,打开build.gradle文件,并添加以下配置:

plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '7.1.0'
}

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}

sourceSets {
    test {
        java {
            srcDirs = ["src/test/java"]
        }
    }
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.