使用Gradle构建简单Java项目

时间:2022-02-08 08:54:14
转载自:pan.baidu.com/share/home?uk=4013289088#category/type=0&qq-pf-to=pcqq.group

使用Gradle编译和打包一个简单的Java项目。

使用Java插件

在build.gradle文件中加上如下语句:
apply plugin: 'java'
Java插件会在构建中添加一些新的约定(如默认的项目结构),新的任务,和新的属性。

Java项目结构

默认的项目结构如下:
     src/main/java 目录包含了项目的源代码。
     src/main/resources 目录包含了项目的资源(如属性文件)。
     src/test/java 目录包含了测试类。
     src/test/resources 目录包含了测试资源。
所有我们构建生成的文件都会在build目录下被创建,这个目录涵盖了以下的子目录,classes目录包含编译过的.class文件,libs目录包含构建生成的jar或war文件。

加入一个主类(main class)

在src/main/java/com/zero目录中添加HelloWorld.java.
package com.zero;
 
public class HelloWorld {
 
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

Java工程中的任务

Java插件在我们的构建中加入了很多任务,例如:
     assemble 任务会编译程序中的源代码,并打包生成Jar文件,这个任务不执行单元测试。
     build 任务会执行一个完整的项目构建。
     clean 任务会删除构建目录。
     compileJava 任务会编译程序中的源代码。
还可以执行命令gradle tasks 得到一个可运行任务及其描述的完整列表。

打包项目

可以通过使用两个不同的任务来打包项目。
如果执行命令gradle assemble,可以看到以下输出:
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble

BUILD SUCCESSFUL

Total time: 4.742 secs
如果执行命令gradle build,可以看到以下输出:
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build UP-TO-DATE

BUILD SUCCESSFUL

Total time: 3.641 secs
这些命令的输出表明了它们的区别:
     assemble任务仅仅执行项目打包所必须的任务集。
     build任务执行项目打包所必须的任务集,以及执行自动化测试。

     这两个命令都会在build/libs目录中创建一个xxx.jar文件。默认创建的Jar文件名称是由这个模版决定的:[projectname].jar,此外,项目的默认名称和其所处的目录名称是一致的。

     尝试运行我们的程序:
$ java -jar xxx.jar
xxx.jar中没有主清单属性
问题出在于没有在manifest文件中配置Jar文件的主类,那怎样解决这个问题?

配置Jar文件的主类

       Java插件在我们的项目中加入了一个Jar任务,每一个Jar对象都一个manifest属性,这个属性是Manifest的一个实例。可以对生成的Jar文件的主类进行配置,使用Manifest接口的attributes()方法。换句话说,我们可以使用一个包含键值对的map结构指定加入到manifest文件的属性集。
       我们能够通过设置Main-Class属性的值,指定我们程序的入口点。只需要在build.gradle文件进行必要的改动即可:
apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.zero.HelloWorld'
    }
}
之后在重复之前的操作就不会有问题了。