从零开始Java多项目构建

举报
yd_221104950 发表于 2020/12/03 01:00:12 2020/12/03
【摘要】 gradle支持多项目构建。本章将从零开始讲多项目构建。 1、多项目结构 ~/Desktop/multiproject$ gradle projects > Task :projects ------------------------------------------------------------ Root project -----------...

gradle支持多项目构建。本章将从零开始讲多项目构建。

1、多项目结构

~/Desktop/multiproject$ gradle projects

> Task :projects

------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'multiproject'
+--- Project ':api'
+--- Project ':services'
| +--- Project ':services:shared'
| \--- Project ':services:webservice'
\--- Project ':shared'


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述
在这里插入图片描述

  • 项目api编译出一个Jar文件供项目webservice使用;
  • 项目shared编译出一个Jar文件存放项目api和services/webservice、项目services/shared/的共用代码;
  • 项目webservice是一个返回XML文件的webapp。

2、根目录的settings.gradle

构建一个多项目,需要在根目录下创建一个settings.gradle文件,并指定哪些项目需要构建。 如:

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

  
 
  • 1

3、根目录的build.gradle

// 配置所有子项目的公共部分
subprojects {
	// 使用Java插件 apply plugin: 'java' // 使用eclipse-wtp插件 apply plugin: 'eclipse-wtp'

	// 外部依赖的仓库,到时gradle在本地找不到就可以到仓库找依赖 repositories { mavenCentral() }

	// 外部依赖 dependencies { testCompile 'junit:junit:4.12' }
	// 指定项目版本号 version = '1.0' // 指定JDK版本号
	sourceCompatibility = '1.8' jar { manifest.attributes provider: 'gradle' }
}

allprojects { tasks.create('hello') { doLast { task -> print "project name is $task.project.name \n" } }
 }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • subprojects{}:配置这个项目的子项目。使用多模块项目时,不同模块之间有相同的配置,导致重复配置,可以将相同的部分抽取出来,使用配置注入的技术完成子项目的配置。根项目就像一个容器, subprojects 方法遍历这个容器的所有元素并且注入指定的配置。allprojects是对所有project的配置,包括Root Project。而subprojects是对所有Child Project的配置
  • buildscript{}里是gradle脚本执行所需依赖,分别是对应的maven库和插件。
  • allprojects里是项目本身需要的依赖,比如代码中某个类是打包到maven私有库中的,那么在allprojects->repositories中需要配置maven私有库,而不是buildscript中,不然找不到

4、Gradle Java插件的约定

参考《使用gradle构建Java项目》
Gradle Java插件有以下约定:

  1. 存放项目源码:src/main/java
  2. 存放测试源码:src/test/java
  3. 存放资源文件:src/main/resources
  4. 在src/test/resources目录下的任何文件都会被添加到classpath中用于运行测试
  5. 所有的输出文件都被创建在build目录里,其中JAR文件在build/libs目录里

3、根据约定创建目录

/*api 项目*/
~/Desktop/multiproject$ mkdir api
~/Desktop/multiproject$ mkdir -p api/src/main/java
~/Desktop/multiproject$ mkdir -p api/src/main/resources
~/Desktop/multiproject$ mkdir -p api/src/test/java
~/Desktop/multiproject$ mkdir -p api/src/test/resources
/*api建两个包*/
/*com.wong.api*/
~/Desktop/multiproject$ mkdir -p api/src/main/java/com/wong/api
/*com.wong.api.impl*/
~/Desktop/multiproject$ mkdir -p api/src/main/java/com/wong/api/impl


/*shared项目*/
~/Desktop/multiproject$ mkdir shared
~/Desktop/multiproject$ mkdir -p shared/src/main/java
~/Desktop/multiproject$ mkdir -p shared/src/main/resources
~/Desktop/multiproject$ mkdir -p shared/src/test/java
~/Desktop/multiproject$ mkdir -p shared/src/test/resources
/*创建包*/
/*com.wong.shared*/
~/Desktop/multiproject$ mkdir -p shared/src/main/java/com/wong/shared
/*com.wong.shared*/
~/Desktop/multiproject$ mkdir -p shared/src/test/java/com/wong/shared
/*resources*/
~/Desktop/multiproject$ mkdir -p shared/src/main/resources/com/wong/shared
~/Desktop/multiproject$ mkdir -p shared/src/test/resources/com/wong/shared

/*services/shared项目*/
~/Desktop/multiproject$ mkdir -p services/shared
~/Desktop/multiproject$ mkdir -p services/shared/src/main/java
~/Desktop/multiproject$ mkdir -p services/shared/src/main/resources
~/Desktop/multiproject$ mkdir -p services/shared/src/test/java
~/Desktop/multiproject$ mkdir -p services/shared/src/test/resources
/*创建包com.wong.services.shared*/
~/Desktop/multiproject$ mkdir -p services/shared/src/main/java/com/wong/services/shared

/*services/webservice项目*/
~/Desktop/multiproject$ mkdir -p services/webservice
~/Desktop/multiproject$ mkdir -p services/webservice/src/main/java
~/Desktop/multiproject$ mkdir -p services/webservice/src/main/resources
~/Desktop/multiproject$ mkdir -p services/webservice/src/test/java
~/Desktop/multiproject$ mkdir -p services/webservice/src/test/resources
/*创建两个包*/
/*com.wong.webservice*/
~/Desktop/multiproject$ mkdir -p services/webservice/src/main/java/com/wong/webservice
/*com.wong.webservice*/
~/Desktop/multiproject$ mkdir -p services/webservice/src/test/java/com/wong/webservice


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

4、向各个目录加入源码文件

(一)项目api

  • 添加PersonList.java
~/Desktop/multiproject$ touch api/src/main/java/com/wong/api/PersonList.java
~/Desktop/multiproject$ vim api/src/main/java/com/wong/api/PersonList.java

  
 
  • 1
  • 2
package com.wong.api;

import java.util.ArrayList;
import com.wong.shared.Person;
import com.wong.api.impl.Impl;

public class PersonList{ private ArrayList<Person> persons = new ArrayList<Person>(); public void doWithImpl(){ try{ Class.forName("org.apache.commons.io.FileUtils"); }catch(ClassNotFoundException e){ throw new RuntimeException(e); } new Impl().implMethod(); } } 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • Impl.java
package com.wong.api.impl;

public class Impl{ public void implMethod(){ double a = 4.0 * 4; } }  

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 添加构建脚本build.gradle
~/Desktop/multiproject$ touch api/build.gradle
~/Desktop/multiproject$ vim build.gradle


  
 
  • 1
  • 2
  • 3
buildscript { repositories { mavenCentral() } dependencies { classpath 'commons-math:commons-math:1.1' }
}

configurations { spi
}

dependencies { compile project(':shared') compile module("commons-lang:commons-lang:2.4") { dependency("commons-io:commons-io:1.2") }
}

// Just a smoke test that using this option does not lead to any exception
compileJava.options.compilerArgs = ['-Xlint:unchecked']

task spiJar(type: Jar) { appendix = 'spi' from sourceSets.main.output include 'com/wong/api/'
}

artifacts {
  spi spiJar
}

task dist(type: Zip) { dependsOn spiJar from 'src/dist' into('libs') { from spiJar.archivePath from configurations.runtime }
}

artifacts { archives dist
}

// We want to test if commons-math was properly added to the build script classpath
org.apache.commons.math.fraction.Fraction lhs = new org.apache.commons.math.fraction.Fraction(1, 3);
org.gradle.buildsrc.BuildSrcClass bsc = new org.gradle.buildsrc.BuildSrcClass()

task checkProjectDependency(dependsOn: project(':shared').jar) { doLast { File cachedSharedJarDir = new File(gradle.gradleUserHomeDir, "cache/multiproject/shared/jars") copy { from project(':shared').jar.archivePath into cachedSharedJarDir } File sharedJar = configurations.compile.files.find { File file -> file.name.startsWith('shared') } assert sharedJar.absolutePath == project(':shared').jar.archivePath.absolutePath }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

(二)项目shared

  • 添加资源文件main.properties
~/Desktop/multiproject$ touch shared/src/main/resources/com/wong/shared/main.properties
~/Desktop/multiproject$ vim shared/src/main/resources/com/wong/shared/main.properties

  
 
  • 1
  • 2

并加入如下内容:

main=mainValue

  
 
  • 1
  • 添加Person.java
~/Desktop/multiproject$ touch shared/src/main/java/com/wong/shared/Person.java
~/Desktop/multiproject$ vim shared/src/main/java/com/wong/shared/Person.java

  
 
  • 1
  • 2
package com.wong.shared;

import java.util.Properties;
import java.io.IOException;

public class Person{ private String name; public Person(String name){ this.name = name; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public String readProperty() throws IOException{ Properties properties = new Properties(); properties.load(getClass().getClassLoader().getResourceAsStream("com/wong/shared/main.properties")); return properties.getProperty("main"); }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

(三)项目services/shared

  • 添加TestPerson.java
~/Desktop/multiproject$ touch services/shared/src/main/java/com/wong/services/shared/TestPerson.java
~/Desktop/multiproject$ vim services/shared/src/main/java/com/wong/services/shared/TestPerson.java

  
 
  • 1
  • 2
package com.wong.services.shared;

import com.wong.shared.Person;

public class TestPerson{ private String name; public void method(){ new Person("Tom"); } }  

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

因为上面要用到项目shared里的Person类,所以我们要为项目services/shared,添加依赖,因此在services/shared根目录下创建build.gradle,并添加如下内容:

~/Desktop/multiproject$ touch services/shared/build.gradle
~/Desktop/multiproject$ vim services/shared/build.gradle

  
 
  • 1
  • 2
dependencies{ implementation project(':shared')
}

  
 
  • 1
  • 2
  • 3

(四)项目services/webservice

  • 添加TestMan.java
~/Desktop/multiproject$ touch services/webservice/src/main/java/com/wong/webservice/TestMan.java
~/Desktop/multiproject$ vim services/webservice/src/main/java/com/wong/webservice/TestMan.java

  
 
  • 1
  • 2
package com.wong.webservice;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.collections.list.GrowthList;
import com.wong.shared.Person;
import com.wong.api.PersonList;

public class TestMan{ private String name; public void method(){ FilenameUtils.separatorsToUnix("my/unix/filename"); ToStringBuilder.reflectionToString(new Person("name")); new GrowthList(); new PersonList().doWithImpl(); } }  

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 添加测试类TestMe
~/Desktop/multiproject$ touch services/webservice/src/test/java/com/wong/webservice/TestMe.java
~/Desktop/multiproject$ vim services/webservice/src/test/java/com/wong/webservice/TestMe.java

  
 
  • 1
  • 2
package com.wong.webservice;

import junit.framework.TestCase;

public class TestMe extends TestCase{ public void testClassPath(){ new TestPerson().method(); } public void testApiCompileClasspath(){ new com.wong.api.PersonList(); } } 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 为项目services/webservice添加依赖
    在services/webservice根目录下创建build.gradle,并添加如下内容:
~/Desktop/multiproject$ touch services/webservice/build.gradle
~/Desktop/multiproject$ vim services/webservice/build.gradle

  
 
  • 1
  • 2
apply plugin: 'war'

version = '3.0'

dependencies { implementation project(':shared'),'commons-collections:commons-collectio
ns:3.2.2@jar','commons-io:commons-io:1.2','commons-lang:commons-lang:2.4@jar' implementation project(':api',configuration:'spi') runtime project(':api')
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

构建结构

在根目录执行gradle build就可以编译成功了。这样多项目编译就完成了。gradle都是通过相应的插件提供的功能来完成编译的。

谢谢阅读。

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/103535001

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。