zoukankan      html  css  js  c++  java
  • 使用Gradle构建Java项目

    使用Gradle构建Java项目

    这个手册将通过一个简单的Java项目向大家介绍如何使用Gradle构建Java项目。

    我们将要做什么?

    我们将在这篇文档中创建一个简单的Java项目,然后使用Gradle构建它。

    需要准备什么?

    • 预留15分钟空闲时间
    • 一件称手的兵器(你最喜欢的IDE或者文本编辑器)
    • Java环境([JDK6](http://www.oracle.com/technetwork/java/javase/downloads/index.html"JDK"及以上版本)

    如何完成这个手册的内容?

    与大多数Spring的入门手册一样,你可以从头开始一步步完成教程中的每一步工作,也可以跳过你已经烂熟的基础步骤。

    不管采用哪种方式,你最后都会得到可工作的代码。
    1、如果要重头开始,猛戳这里
    2、如果要跳过基础部分,需执行以下操作:

    • 下载并解压本文档相关源代码,或者使用Git克隆一个:git clone https://github.com/spring-guides/gs-gradle.git
    • cd 进入 gs-gradle/initial
    • 参考到安装Gradle部分
    当你完成后,你可以使用gs-gradle/complete来检查你的结果。

    配置项目

    首先需要配置一个项目给Gradle进行构建。为了保证我们能专注于Gradle,目前最好创建最简单的Java项目。

    创建目录结构

    操作目录:D:N3verL4ndDesktop

    在项目主目录下,创建以下子目录;在Windows系统下可以使用命令:md srcmainjavahello


    在src/main/java/hello目录中,你可以创建任何Java类。

    为简单起见并且为了与指南的其余部分保持一致,我们建议创建两个类HelloWorld.java和Greeter.java

    src/main/java/hello/HelloWorld.java的源代码:

    package hello;
     
    public class HelloWorld {
      public static void main(String[] args) {
        Greeter greeter = new Greeter();
        System.out.println(greeter.sayHello());
      }
    }
    src/main/java/hello/Greeter.java的源代码:

    package hello;
     
    public class Greeter {
      public String sayHello() {
        return "Hello world!";
      }
    }

    安装Gradle

    到目前为止,我们已经搭建了一个可以用来使用Gradle构建的项目,现在到了安装Gradle的时候了。
    Gradle可以从http://www.gradle.org/downloads下载。我们仅需要下载Gradle的二进制发布包,所以在刚才提供的连接上寻找gradle-version-bin.zip文件(当然,也可以下载gradle-version-all.zip,它包含源代码、文档以已编译代码)
    解压缩下载的文件,并将解压后目录中的bin目录加到环境变量中。
    可以在命令行中执行以下代码来测试Gradle是否安装成功

    Gradle可以做些什么呢?

    Gradle已经安装到系统上了,那么它可以做什么呢?在我们为项目创建build.gradle文件之前,我们可以先问一下Gradle目前有哪些可用的任务(Tasks):
    gradle tasks
    我们可以看到可用任务(Tasks)的列表。假设你执行Gradle的目录不存在build.gradle文件,你可以看到一些非常基础的任务,类似于:
    D:N3verL4ndDesktop	est>gradle tasks
    :tasks
    
    ------------------------------------------------------------
    All tasks runnable from root project
    ------------------------------------------------------------
    
    Application tasks
    -----------------
    run - Runs this project as a JVM application
    
    Build tasks
    -----------
    assemble - Assembles the outputs of this project.
    build - Assembles and tests this project.
    buildDependents - Assembles and tests this project and all projects that depend on it.
    buildNeeded - Assembles and tests this project and all projects it depends on.
    classes - Assembles main classes.
    clean - Deletes the build directory.
    jar - Assembles a jar archive containing the main classes.
    testClasses - Assembles test classes.
    
    Build Setup tasks
    -----------------
    init - Initializes a new Gradle build. [incubating]
    
    Distribution tasks
    ------------------
    assembleDist - Assembles the main distributions
    distTar - Bundles the project as a distribution.
    distZip - Bundles the project as a distribution.
    installDist - Installs the project as a distribution as-is.
    
    Documentation tasks
    -------------------
    javadoc - Generates Javadoc API documentation for the main source code.
    
    Help tasks
    ----------
    buildEnvironment - Displays all buildscript dependencies declared in root project 'test'.
    components - Displays the components produced by root project 'test'. [incubating]
    dependencies - Displays all dependencies declared in root project 'test'.
    dependencyInsight - Displays the insight into a specific dependency in root project 'test'.
    dependentComponents - Displays the dependent components of components in root project 'test'. [incubating]
    help - Displays a help message.
    model - Displays the configuration model of root project 'test'. [incubating]
    projects - Displays the sub-projects of root project 'test'.
    properties - Displays the properties of root project 'test'.
    tasks - Displays the tasks runnable from root project 'test'.
    
    Verification tasks
    ------------------
    check - Runs all checks.
    test - Runs the unit tests.
    
    Rules
    -----
    Pattern: clean<TaskName>: Cleans the output files of a task.
    Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
    Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.
    
    To see all tasks and more detail, run gradle tasks --all
    
    To see more detail about a task, run gradle help --task <task>
    
    BUILD SUCCESSFUL
    
    Total time: 1.378 secs
    D:N3verL4ndDesktop	est>
    尽管上面的列出的任务是可用的,但是如果没有项目的构建配置他们无法提供太多的价值。

    当配置了项目的build.gradle后,一些任务将变得非常有用。
    如果在build.gradle中配置了插件(plugins)上面的任务列表会变得更长,最好在配置插件后使用gradle task看看那些任务是可用的。
    刚说到配置插件,马上我们就会配置一个插件来启用基础的Java构建功能。

    构建Java代码

    先从简单的开始,创建一个最简单的只有一行的build.gradle文件:

    apply plugin: 'java'

    别看只有一行配置,提供的能力可不是一点点哦。再执行一下gradle task,我们可以看到任务列表中增加了一些内容,比如:用来编译java项目的任务、用来创建JavaDoc的任务、用来执行单元测试的任务。
    我们经常使用的任务是gradle build,这个任务执行以下操作:编译、执行单元测试、组装Jar文件:
    gradle build
    几秒钟以后,会看到"BUILD SUCCESSFUL"输出,说明构建已经完成了。
    可以到"build"目录中查看构建结构,在这个目录中我们可以看到很多子目录,其中有三个我们需要特别注意:
    classes: 保存被编译后的.class文件
    reports: 构建报告(如:测试报告)
    lib: 组装好的项目包(通常为:.jar或者.war文件)
    classes目录包含编译生成的所有.class文件。执行完编译后,我们应该可以在这里找到"HelloWorld.class"和"Greeter.class"。
    到目前为止,我们项目并没有申明任何依赖,所以"debendency_cache"目录是空的。
    "reports"目录会包含项目单元测试的测试报告,当然,当前项目并未编写任何单元测试,所以,也是空目录。
    "lib"目录包含打包后的jar或war文件,在后面的内容中我们将学会如何定义JAR的名称和版本号。

    申明依赖

    我们的Hello World例程非常简单且不依赖于任何第三方库,但是大多数应用程序都会依赖第三方库提供的通用或复杂的功能。
    例如:假设我们希望更好的说"Hello World!",我们希望应用程序能同时输出当前的日期和时间。当然这可以使用Java自身的日期和时间相关库,但是我们可以使用"Joda Time"库实现更有趣的功能。
    首先,把HelloWorld.jara类修改成下面这样:

    package hello;
     
    import org.joda.time.LocalTime;
     
    public class HelloWorld {
      public static void main(String[] args) {
    	  LocalTime currentTime = new LocalTime();
    	  System.out.println("The current local time is: " + currentTime);
          Greeter greeter = new Greeter();
          System.out.println(greeter.sayHello());
      }
    }
    这里我们的HelloWorld使用"Joda Time"的LocalTime类来获取和输出当前时间。
    如果我们马上执行gradle build来构建项目,构建过程将会失败,因为我们并未将"Joda Time"库声明为编译时依赖库。
    首先,我们需要添加一些配置来定义第三方库的来源:

    repositories {
        mavenLocal()
        mavenCentral()
    }

    上面的repositories定义,告诉构建系统通过Maven中央库来检索项目依赖的软件包,Gradle在很大程度上依赖Maven构建工具的许多约定和基础功能,包括使用Maven中央的库来处理依赖关系。
    现在我们可以使用第三方库了,但现需要定义:
    dependencies {
        compile "joda-time:joda-time:2.2"
    }

    使用dependencies块,我们定义了一条Joda Time的依赖项。这里,明确指定使用joda-time组内的版本为2.2的joda-time库。
    另一个要注意的是,我们在这个依赖定义中指定依赖是compile范围的。意思是,这个库在编译和运行时都需要(如果我们正在构建WAR文件,这个文件会在/WEB-INF/libs目录下)。另外值得注意的依赖类型包括:
    providedCompile:在编译期间需要这个依赖包,但在运行期间可能由容器提供相关组件(比如:Java Servlet API)
    testCompile:依赖项仅在构建和运行测试代码时需要,在项目运行时不需要这个依赖项。
    最后,我们来定义我们将生成的Jar文件的名字:
    jar {
        baseName = 'gs-gradle'
        version =  '0.1.0'
    }

    jar块定义如何命名JAR文件,在上面的例子中,我们的JAR文件的名字为:gs-gradle-0.1.0.jar。
    注:这个时候如果执行gradle build,Gradle会花一些时间从Maven中央库下载Joda Time包(具体下载时间依赖于你的网速)

    当然,我们可以使用国内的镜像:

    repositories {
    maven {
    url 'http://maven.aliyun.com/nexus/content/groups/public/'
    }
    }

    使用Gradle Wrapper来构建项目

    Gradle Wrapper是开始一个Gradle构建的首选方式。它包含了windows批处理以及OS X和Linux的Shell脚本。这些脚本允许我们在没有安装Gradle的系统上执行Gradle构建。要实现这个功能,我们需要在我们的build.gradle文件中增加以下代码:
    task wrapper(type: Wrapper) {
        gradleVersion = '1.11'
    }

    执行下面代码来下载和初始化wrapper脚本:
    gradle wrapper
    命令执行完后,我们可以看到增加了一些新文件。有两个文件在根目录下,wapper的jar文件和properties文件在新增的gradle/wrapper目录下。
    └── initial
        └── gradlew
        └── gradlew.bat
        └── gradle
            └── wrapper
                └── gradle-wrapper.jar
                └── gradle-wrapper.properties

    现在Gradle Wrapper已经可以用来构建系统了。把这些文件增加到版本控制系统中,然后再任何时候、任何地方只要迁出这些文件就一个按照同样的方式(与当前生成 Wrapper的Gradle版本一致)构建系统。运行wrapper脚本来构建系统,跟我们之前的命令很像:
    gradlew.bat build
    当第一次通过wrapper使用指定版本的Gradle构建系统时,wrapper首先下载对应版本的Gradle可执行文件。Gradle Wrapper的所有文件在都可以被提交到版本库中,所以,任何人都可以在没有安装Gradle的环境下使用相同版本的Gradle构建系统。

    在这个时候,我们需要重新构建我们的代码,构建的结果目录如下:


    build
    ├── classes
    │   └── main
    │       └── hello
    │           ├── Greeter.class
    │           └── HelloWorld.class
    ├── dependency-cache
    ├── libs
    │   └── gs-gradle-0.1.0.jar
    └── tmp
        └── jar
            └── MANIFEST.MF
    Jar文件中包含我们希望打包的Gretter和HelloWorld类。
    D:N3verL4ndDesktop	est> jar tvf build/libs/gs-gradle-0.1.0.jar
         0 Tue Mar 21 15:48:16 CST 2017 META-INF/
        25 Tue Mar 21 15:48:16 CST 2017 META-INF/MANIFEST.MF
         0 Tue Mar 21 15:48:16 CST 2017 hello/
       369 Tue Mar 21 15:48:16 CST 2017 hello/Greeter.class
       988 Tue Mar 21 15:48:16 CST 2017 hello/HelloWorld.class
    
    D:N3verL4ndDesktop	est>

    需要注意的,即使我们声明了joda-time依赖,但这里也没有包括对应的库文件,而且生成的JAR文件也不是可运行JAR文件。
    要想让代码可以运行,我们可以使用Gradle的application插件。增加以下内容到build.gradle文件中。
    apply plugin: 'application'
    mainClassName = 'hello.HelloWorld'

    现在我们的app可以执行了。
    D:N3verL4ndDesktop	est>gradle run
    :compileJava UP-TO-DATE
    :processResources NO-SOURCE
    :classes UP-TO-DATE
    :run
    The current local time is: 15:55:00.146
    Hello world!
    
    BUILD SUCCESSFUL
    
    Total time: 1.514 secs
    D:N3verL4ndDesktop	est>


    为了能够将依赖包也以一起打包,比如,我们希望构建一个WAR包,可以包含第三方组件的打包格式,我们可以使用Gradle的WAR插件。如果我们使用Spring Boot并且希望得到一个可执行的JAR文件,我们可以使用spring-boot-gradle-plugin插件。在我们的示例中,gradle没有足够的信息来了解我们的目标系统。但是,目前介绍的内容已经足够我们开始使用Gradle了。


    下面是本文需要用的的build.gradle文件:
    apply plugin: 'java'
    apply plugin: 'application'
    mainClassName = 'hello.HelloWorld'
    
    repositories {
    	maven {
    	url 'http://maven.aliyun.com/nexus/content/groups/public/'
    	}
    }
    
    dependencies {
    	compile "joda-time:joda-time:2.2"
    }
    
    jar {
    	baseName = 'gs-gradle'
    	version = '0.1.0'
    }
    
    task wrapper(type : Wrapper) {
    	gradleVersion = '1.11'
    }

    总结

    恭喜,你已经创建了一个简单的然而可用的Gradle构建文件来构建Java项目。


    http://spring.io/guides/gs/gradle/

  • 相关阅读:
    LeetCode对撞指针汇总
    167. Two Sum II
    215. Kth Largest Element in an Array
    2018Action Recognition from Skeleton Data via Analogical Generalization over Qualitative Representations
    题解 Educational Codeforces Round 84 (Rated for Div. 2) (CF1327)
    题解 JZPKIL
    题解 八省联考2018 / 九省联考2018
    题解 六省联考2017
    题解 Codeforces Round #621 (Div. 1 + Div. 2) (CF1307)
    题解Codeforces Round #620 (Div. 2)
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/6616208.html
Copyright © 2011-2022 走看看