7.1java插件

正如我们所看到的,它是一个通用的构建工具。它可以建立几乎任何你关心实现在你的构建脚本,然而,它不构建任何东西除非你添加代码来构建脚本这样做。

幸运地, 你不需要。 它 通过使用插件 解决了这个问题, 在某种方式 一个插件是一个扩展的 Gradle 配置项目, 通常通过添加一些预配置的任务一起来做一些有用的事情, Gradle一些插件,你可以很容易地编写自己的和与他人分享, 一个这样的插件是java plugin,这个插件添加一些任务到你的项目中, 将编译和单元测试您的Java源代码, 并将代码打包到一个JAR文件。

 

Java插件是公约的基础。 这意味着插件定义了默认值对许多方面的项目, 例如,Java本地源文件, 如果你遵循公约在您的项目, 你一般不需要做太多你的构建脚本得到有用的构建,Gradle 允许您定制您的项目如果你不想或不能按照约定在某种方式, 事实上,因为支持Java项目被实现为一个插件, 你不需要使用插件在所有构建一个Java项目,如果你不想。

我们已经说过许多关于java插件的例子, 依赖关系管理和多项目构建在后面的章节, 在这一章中,我们想给你一个初步的想法,如何使用Java插件来构建一个Java项目。

7.2基本的java项目

让我们看一个简单的例子。使用Java插件,将以下内容添加到你的构建文件:

例7.1 使用Java插件

build.gradle

 

  'java'

 

这是所有您需要定义一个Java项目。这将应用Java插件到你的项目,它添加了一个数量的任务到您的项目。

希望找到你的生产Gradle源代码在src / main / java和您的测试源代码在src / test / java。此外,任何文件在src / main /资源将被包含在JAR文件作为资源,和任何文件在src /test/资源将被包含在类路径中用于运行测试。所有输出文件是构建目录下创建,JAR文件结束了在 build/libs 目录。

7.2.1 构建项目

Java插件添加任务到您的项目,然而,只有少数的任务,您将需要使用来构建项目,最常用的任务是构建任务,这确实完全构建项目,当你运行 gradle build, Gradle将编译和测试您的代码,和创建一个JAR文件,包含你的主要类和资源:

输出 gradle build:

> gradle build

:compileJava

:processResources

:classes

:jar

:assemble

:compileTestJava

:processTestResources

:testClasses

:test

:check

:build

 

BUILD SUCCESSFUL

 

Total time: 1 secs

其他一些有用的任务有:

clean

删除构建目录,删除所有建立文件

assemble

编译和测试你的代码,其他插件添加更多的工件来完成这个任务,例如,如果你使用War插件,这个任务还将构建WAR文件的

check

编译和测试你的代码,其他插件添加更多的检查这个任务。例如,如果您使用代码质量插件,这个任务也将运行Checkstyle反对你的源代码。

7.2.2 外部依赖

通常,一个Java项目将有一些依赖于外部JAR文件,引用这些JAR文件的项目,你需要告诉Gradle在哪里可以找到,在Gradle中,构建如JAR文件,在本地 repository中,一个repository可用于获取依赖项的项目,或者发布一个项目的构建, 或两者兼而有之。 对于这个示例,我们将使用公共Maven存储库:

例子7.3.3添加Maven库

build.gradle 
        
 
        
repositories {
 
        

                       mavenCentral() 
                 
 
                 

                   }

让我们添加一些依赖。我们将要声明我们的类有一个compile-time依赖在commons collections,和我们的测试类有一个complie-time依赖

7.4 添加依赖

build.gradle 
                
 
                

                           dependencies { 
                         
 
                         
'commons-collections' 
                          , name:  
                          'commons-collections' 
                          , version:  
                          '3.2' 
                              
 
                         
testCompile group:  
                          'junit' 
                          , name:  
                          'junit' 
                          , version:  
                          '4.+'
 
                         
}

7.2.3定制项目

java插件为你的项目添加一些属性,这些属性通常是以默认值开始的,如果他们不合适的话,你很容易的改变他们的值,让我们看一下这个例子,对于我们java项目来说,这有一个特殊的版本,随着java版本,我们的资源也被写入,我们已经添加了一些属性为JAR manifest

7.5 定制的MANIFEST.MF

build.gradle
 
                        
  
                                 1.5 version = 
                                   
                                 '1.0' 
                                 

                                   jar { 
                                 
 
                                 

                                       manifest { 
                                 
 
                                 
'Implementation-Title' 
                                  :  
                                  'Gradle Quickstart' 
                                  ,  
                                  'Implementation-Version' 
                                  : version
 
                                 

                                       } 
                                 
 
                                 

                                   }

7.2.4发布JAR文件

通常JAR文件需要发布到某个地方,你需要告诉Gradle发布的JAR文件在哪,在Gradle中,构建的JAR文件被发布到存储库中,例如,我们将会发布本地目录,

你也能够发布远程位置,或者多个位置

7.7 发布JAR文件

build.gradle
 
                        

                                   uploadArchives { 
                                 
 
                                 

                                       repositories { 
                                 
 
                                 

                                          flatDir { 
                                 
 
                                 
'repos'
 
                                 

                                          } 
                                 
 
                                 

                                       } 
                                 
 
                                 

                                   }

发布JAR文件,运行gradle  uploadArchives 

7.2.5 创建一个Eclipse项目

导出项目到Eclipse中,你需要在你的build 文件中添加一个插件

7.8  Eclipse plugin

  'eclipse'

现在执行gradle eclipse命令来生成Eclipse项目文件,更多关于Eclipse任务中可以找到章38,Eclipse插件。

7.2.6概要

下面是完整的构建文件为示例:

7.9Java示例——完整的构建文件

build.gradle
 
                                
  
                                         'java'
 
                                        
  
                                         'eclipse' 
                                         

                                             
                                         
 
                                         
1.5
 
                                         
version =  
                                          '1.0'
 
                                         

                                           jar { 
                                         
 
                                         

                                               manifest { 
                                         
 
                                         
'Implementation-Title' 
                                          :  
                                          'Gradle Quickstart' 
                                          ,  
                                          'Implementation-Version' 
                                          : version
 
                                         

                                               } 
                                         
 
                                         
 
 
                                         

                                           repositories { 
                                         
 
                                         

                                               mavenCentral() 
                                         
 
                                         

                                           } 
                                         
 
                                         

                                             
                                         
 
                                         

                                           dependencies { 
                                         
 
                                         
'commons-collections' 
                                          , name:  
                                          'commons-collections' 
                                          ,  
                                          version:  
                                          '3.2' 
                                              
 
                                         
     
                                               
                                          testCompile group:  
                                          'junit' 
                                          , name:  
                                          'junit' 
                                          , version:  
                                          '4.+'
 
                                         

                                           } 
                                         
 
                                         

                                             
                                         
 
                                         

                                           test { 
                                         
 
                                         

                                               systemProperties 
                                         
 
                                         'property': 
                                           
                                         'value' 
                                         

                                           } 
                                         
 
                                         

                                             
                                         
 
                                         

                                           uploadArchives { 
                                         
 
                                         

                                               repositories { 
                                         
 
                                         

                                                  flatDir { 
                                         
 
                                         

                                                      dirs 
                                         
 
                                         'repos' 
                                         

                                                  } 
                                         
 
                                         

                                               } 
                                         
 
                                         

                                           }

7.3多个项目的java构建

现在让我们来看一个典型的多项目建设,下面是为项目的布局:

7.10 多项目构建——分层布局

Build layout

multiproject/

  api/

  services/webservice/

  shared/

我们有三个项目,API项目是一个jar文件向客户提供一个XML webservice。项目webservice是一个web应用返回XML。项目shared包含api和webservice的代码

7.3.1定义一个多项目建设

我们使用一个简单的层次布局。下面是相应的设置文件:

7.11  多项目构建——设置 gradle文件

settings.gradle

  "shared",   "api",   "services:webservice",   "services:shared"

你可以找到更多关于设置文件在56章,构建多项目。

7.3.2常见配置

对于打错书项目构建,在所有项目中有一些常见的配置,例子,在根项目中我们会定义一些常见的配置,使用一个叫做 configuration injection .

 技术。根项目就像一个容器和子项目方法遍历这个容器的元素——项目在这个实例,将指定的配置这样我们可以很容易地定义清单内容对所有档案,和一些常见的依赖关系:

 7.12多项目构建——常见的配置

build.gradle
 
 
                               

                                         subprojects { 
                                       
 
                                       
'java' 
                                           
 
                                       
     
                                            
                                          
                                        'eclipse-wtp'
 
                                       

                                           
                                       
 
                                       

                                             repositories { 
                                       
 
                                       

                                                mavenCentral() 
                                       
 
                                       

                                             } 
                                       
 
                                       

                                           
                                       
 
                                       

                                             dependencies { 
                                       
 
                                       
'junit:junit:4.11'
 
                                       

                                             } 
                                       
 
                                       

                                           
                                       
 
                                       
'1.0'
 
                                       

                                           
                                       
 
                                       

                                             jar { 
                                       
 
                                       
'gradle'
 
                                       

                                             } 
                                       
 
                                       

                                         }

注意,我们的样例应用java插件每个子项目。这意味着任务和配置属性,我们在前一节中看到每个子项目中可用所以,从根项目目录你可以编译,测试盒JAR所有项目通过运行gradle.gradle

7.3.3 项目之间的依赖性   

一个项目 的 JAR文件是用来编译另一个项目, 在api构建文件我们将添加一个依赖JAR产生的共享项目。由于这种依赖性, Gradle将确保项目共享总是之前建成项目的api

7.13 多项目构建——项目之间的依赖性

api/build.gradle 
                                       
 
                                       

                                                  dependencies { 
                                                
 
                                                
':shared' 
                                                 )
 
                                                

                                                  }

7.3.4创建一个分布

我们也添加一个分布,被运送到客户端:

7.14多项目构建——分配文件

api/build.gradle 
                                               
 
                                               

                                                          task dist(type: Zip) { 
                                                        
 
                                                        

                                                              dependsOn spiJar 
                                                        
 
                                                        
'src/dist' 
                                                            
 
                                                        
     
                                                              
                                                          into( 
                                                         'libs' 
                                                         ) {
 
                                                        

                                                                  from spiJar.archivePath 
                                                        
 
                                                        

                                                                  from configurations.runtime 
                                                        
 
                                                        

                                                              } 
                                                        
 
                                                        

                                                          } 
                                                        
 
                                                        

                                                          artifacts { 
                                                        
 
                                                        

                                                             archives dist 
                                                        
 
                                                        

                                                          }