日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在gradle中构建java项目

發布時間:2024/2/28 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在gradle中构建java项目 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • 構建java項目的兩大插件
  • 管理依賴
  • 編譯代碼
  • 管理resource
  • 打包和發布
  • 生成javadoc

簡介

之前的文章我們講到了gradle的基本使用,使用gradle的最終目的就是為了構建java項目。今天本文將會詳細的講解如何在gradle中構建java項目。

構建java項目的兩大插件

安裝java項目的目的不同,構建java項目有兩大插件,一個是application,表示構建的是java應用程序;一個是java-library,表示構建的是java庫,供別的項目使用。

不管是構建應用程序還是java庫,我們都可以很方便的使用gradle init來創新一個新的gradle項目:

$ gradle initSelect type of project to generate:1: basic2: application3: library4: Gradle plugin Enter selection (default: basic) [1..4] 2Select implementation language:1: C++2: Groovy3: Java4: Kotlin5: Scala6: Swift Enter selection (default: Java) [1..6] 3Select build script DSL:1: Groovy2: Kotlin Enter selection (default: Groovy) [1..2] 1Select test framework:1: JUnit 42: TestNG3: Spock4: JUnit Jupiter Enter selection (default: JUnit 4) [1..4]Project name (default: demo): Source package (default: demo):BUILD SUCCESSFUL 2 actionable tasks: 2 executed

application和library的不同之處在于第二步選擇的不同。

兩者在build.gradle中的不同在于plugins的不同,application的plugin是:

plugins {id 'application' }

而library的plugin是:

plugins {id 'java-library' }

還有一個不同之處是依賴的不同,先看一個application的依賴:

dependencies {testImplementation 'junit:junit:4.13' implementation 'com.google.guava:guava:29.0-jre' }

再看一個library的依賴:

dependencies {testImplementation 'junit:junit:4.13' api 'org.apache.commons:commons-math3:3.6.1' implementation 'com.google.guava:guava:29.0-jre' }

因為library是需要給第三方應用程序使用的,所以這里多了一個api的使用,api表示是第三方應用程序也需要依賴這個包,而implementation表示的是該包只是在這個項目內部被依賴。

在構建libary的時候,還可以自定義manifest的信息:

tasks.named('jar') {manifest {attributes('Implementation-Title': project.name,'Implementation-Version': project.version)} }

上面的例子將會在META-INF/MANIFEST.MF生成:

Manifest-Version: 1.0 Implementation-Title: lib Implementation-Version: 0.1.0

我們還可以指定編譯的java版本號和lib的版本:

java {toolchain {languageVersion = JavaLanguageVersion.of(11)} }version = '1.2.1'

管理依賴

java的依賴一般都是jar包組成的library。和maven一樣,我們在gradle中指定依賴需要指定依賴的名字和版本號,依賴的范圍:是運行時依賴還是編譯時依賴,還有一個重要的就是在哪里可以找到這個library。

前面兩個屬性我們可以在dependencies中找到,后面一個我們可以在repositories中找到,看一個例子:

repositories {mavenCentral() }dependencies {implementation 'org.hibernate:hibernate-core:3.6.7.Final' }

還可以使用這種形式的maven:

repositories {maven {url "http://repo.mycompany.com/maven2"} }

或者Ivy:

repositories {ivy {url "http://repo.mycompany.com/repo"} }

甚至可以使用本地的local dir:

repositories {flatDir {dirs 'lib'}flatDir {dirs 'lib1', 'lib2'} }

上面定義了一個mavenCentral的倉庫,我們可以在這個倉庫中去查找hibernate-core這個依賴的jar包。

在dependencies這一塊,我們可以定義依賴包的工作范圍:

  • compileOnly: 表示依賴包只被用來編譯代碼,并不用在程序的運行。

  • implementation:表示依賴包被用在編譯和運行時。

  • runtimeOnly: 只在運行時使用。

  • testCompileOnly: 僅在test的編譯時使用。

  • testImplementation:在test的編譯和運行時使用。

  • testRuntimeOnly: 在test的運行時使用。

我們還可以添加動態的依賴:

dependencies {implementation 'org.springframework:spring-web:5.+' }

使用項目作為依賴:

dependencies {implementation project(':shared') }

編譯代碼

一般情況下你的源代碼需要放在src/main/java 目錄下,測試代碼需要放在src/test/java下面。然后添加compileOnly 或者 implementation依賴,如果需要測試的話,添加testCompileOnly或者testImplementation依賴。

然后就可以運行compileJava和compileTestJava來編譯代碼了。

當然,如果你有自定義的源文件目錄,也可以這樣手動指定:

sourceSets {main {java {srcDirs = ['src']}}test {java {srcDirs = ['test']}} }

上面的代碼中我們給srcDirs重新賦值了。如果我們只是想要在現有的代碼路徑上再添加一個新的路徑,那么可以使用srcDir:

sourceSets {main {java {srcDir 'thirdParty/src/main/java'}} }

除了源代碼的路徑,我們還可以配置編譯的參數,并指定編譯的JDK版本號:

compileJava {options.incremental = trueoptions.fork = trueoptions.failOnError = falseoptions.release = 7 }

注意,gradle必須要在JDK8以上才能運行,但是我們可以指定gradle去使用Java 6 或者 Java 7去編譯源代碼。

我們還可以指定預覽版本的特性:

tasks.withType(JavaCompile) {options.compilerArgs += "--enable-preview" } tasks.withType(Test) {jvmArgs += "--enable-preview" } tasks.withType(JavaExec) {jvmArgs += "--enable-preview" }

管理resource

java除了源代碼文件之外,還有一些resource文件,比如配置文件,圖片文件,語言文件等等。我們需要將這些配置文件拷貝到特定的目標目錄中。

默認情況下,gradle會拷貝src/[sourceSet]/resources 中的文件到目標文件夾中。

我們看一個復雜的拷貝動作:

task copyDocs(type: Copy) {from 'src/main/doc'into 'build/target/doc' }//for Ant filter import org.apache.tools.ant.filters.ReplaceTokens//for including in the copy task def dataContent = copySpec {from 'src/data'include '*.data' }task initConfig(type: Copy) {from('src/main/config') {include '**/*.properties'include '**/*.xml'filter(ReplaceTokens, tokens: [version: '2.3.1'])}from('src/main/config') {exclude '**/*.properties', '**/*.xml'}from('src/main/languages') {rename 'EN_US_(.*)', '$1'}into 'build/target/config'exclude '**/*.bak'includeEmptyDirs = falsewith dataContent }

打包和發布

我們可以根據不同的構建類型來打包對應的文件。比如對應java lib來說,我們可以同時上傳源代碼和java doc文件:

java {withJavadocJar()withSourcesJar() }

比如說我們還可以打包成一個fat jar包:

plugins {id 'java' }version = '1.0.0'repositories {mavenCentral() }dependencies {implementation 'commons-io:commons-io:2.6' }task uberJar(type: Jar) {archiveClassifier = 'uber'from sourceSets.main.outputdependsOn configurations.runtimeClasspathfrom {configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }} }

生成javadoc

gradle的java library插件有一個javadoc task,可以為java項目生成文檔。它支持標準的javadoc,也支持其他類型的文檔,比如說Asciidoc,我們看一個生成Asciidoc的例子:

configurations {asciidoclet }dependencies {asciidoclet 'org.asciidoctor:asciidoclet:1.+' }task configureJavadoc {doLast {javadoc {options.doclet = 'org.asciidoctor.Asciidoclet'options.docletpath = configurations.asciidoclet.files.toList()}} }javadoc {dependsOn configureJavadoc }

本文已收錄于 http://www.flydean.com/gradle-build-java-projects/

最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!

總結

以上是生活随笔為你收集整理的在gradle中构建java项目的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。