使用maven構(gòu)建java9 service實例詳解
序
本文主要研究下如何在maven里頭構(gòu)建java9 multi module及service實例
maven
整個工程跟傳統(tǒng)maven多module的工程結(jié)構(gòu)一樣,java9的一個module對應(yīng)maven project的一個module。下面是根目錄下的pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>java9-service-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<modules>
<module>consumer-demo</module>
<module>service-sort</module>
<module>service-sort-bubble</module>
<module>service-sort-merge</module>
</modules>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--讓intellij能夠正確編譯java9,不然老是變回使用1.5-->
<maven.compiler.source>9</maven.compiler.source>
<maven.compiler.target>9</maven.compiler.target>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<release>9</release>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
這里管理了一個maven-compiler-plugin,配置release為9,因為java9支持multi release,可以同時支持多個java版本,這里編譯為java9版本。
service-sort
這個是service接口module
module service.sort {
exports service.sort;
uses service.sort.SortService;
}
這里同時聲明uses SortService表示是它需要在這個module里頭使用ServiceLoader去加載service實例
public interface SortService {
public <T extends Comparable> List<T> sortList(List<T> list);
public static SortService getProviderInstanceLazy() {
Stream<Provider<SortService>> providers = ServiceLoader.load(SortService.class)
.stream();
//provider方法等到get的時候才會實例化
SortService service = providers.map(Provider::get)
.findAny()
.orElse(null);
return service;
}
}
這里在聲明接口的同時,也增加了靜態(tài)方法,用于加載service實例。
service-sort-bubble
maven
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>java9-service-demo</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>service-sort-bubble</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>service-sort</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
這里添加對api包的依賴
module-info.java
module service.sort.bubble {
requires service.sort;
provides service.sort.SortService with sort.impl.bubble.BubbleSort;
}
這里聲明了BubbleSort提供了SortService的實現(xiàn)
BubbleSort
public class BubbleSort implements SortService {
public <T extends Comparable> List<T> sortList(List<T> list) {
System.out.println("use BubbleSort");
for (int outer = 0; outer < list.size() - 1; outer++) {
for (int inner = 0; inner < list.size()-outer-1; inner++) {
if (list.get(inner).compareTo(list.get(inner + 1)) > 0) {
swap(list, inner);
}
}
}
return list;
}
private <T> void swap(List<T>list, int inner) {
T temp = list.get(inner);
list.set(inner, list.get(inner + 1));
list.set(inner + 1, temp);
}
}
service-sort-merge
maven
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>java9-service-demo</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>service-sort-merge</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>service-sort</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
module-info.java
module service.sort.merge {
requires service.sort;
provides service.sort.SortService with sort.impl.merge.MergeSort;
}
這里聲明了MergeSort為SortService接口的實現(xiàn)
MergeSort
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Arrays;
import service.sort.SortService;
public class MergeSort implements SortService {
public <T extends Comparable> List<T> sortList(List<T> list) {
System.out.println("using MergeSort");
Collections.sort(list);
return list;
}
}
consumer
maven
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>java9-service-demo</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>consumer-demo</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>service-sort</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
注意這里沒有添加實現(xiàn)類的依賴
module-info.java
module consumer {
requires service.sort;
}
Main
public class Main {
public static void main(String[] args) {
System.out.println("sort service consumer started.");
List<Integer> data = new ArrayList<Integer>();
data.add(5);
data.add(3);
data.add(10);
data.add(2);
data.add(8);
SortService sortService = SortService.getProviderInstanceLazy();
if (sortService != null) {
sortService.sortList(data);
}
System.out.println(data);
System.out.println("finish");
}
}
編譯及運行
編譯
mvn clean install
這里是在根目錄下執(zhí)行
使用bubble
java --module-path ./consumer-demo/target/consumer-demo-0.0.1-SNAPSHOT.jar:./service-sort/target/service-sort-0.0.1-SNAPSHOT.jar:./service-sort-bubble/target/service-sort-bubble-0.0.1-SNAPSHOT.jar --module consumer/consumer.Main
注意這里添加了bubble的jar到module-path
輸出
sort service consumer started.
use BubbleSort
[2, 3, 5, 8, 10]
finish
使用merge
java --module-path ./consumer-demo/target/consumer-demo-0.0.1-SNAPSHOT.jar:./service-sort/target/service-sort-0.0.1-SNAPSHOT.jar:./service-sort-merge/target/service-sort-merge-0.0.1-SNAPSHOT.jar --module consumer/consumer.Main
注意這里添加了merge的jar到module-path
輸出
sort service consumer started.
using MergeSort
[2, 3, 5, 8, 10]
finish
兩個service實現(xiàn)都添加
java --module-path ./consumer-demo/target/consumer-demo-0.0.1-SNAPSHOT.jar:./service-sort/target/service-sort-0.0.1-SNAPSHOT.jar:./service-sort-bubble/target/service-sort-bubble-0.0.1-SNAPSHOT.jar:./service-sort-merge/target/service-sort-merge-0.0.1-SNAPSHOT.jar --module consumer/consumer.Main
或者
java --module-path ./consumer-demo/target/consumer-demo-0.0.1-SNAPSHOT.jar:./service-sort/target/service-sort-0.0.1-SNAPSHOT.jar:./service-sort-merge/target/service-sort-merge-0.0.1-SNAPSHOT.jar:./service-sort-bubble/target/service-sort-bubble-0.0.1-SNAPSHOT.jar --module consumer/consumer.Main
輸出
sort service consumer started.
use BubbleSort
[2, 3, 5, 8, 10]
finish
發(fā)現(xiàn)貌似跟添加到path的順序沒有關(guān)系,即使把merge的jar包放在前面,也是使用bubble
小結(jié)
在java6的時候就已經(jīng)有ServiceLoader了,不過那個時候是依賴在jar包的META-INF/services目錄下創(chuàng)建一個service接口全路徑名稱的文件,里頭寫上實現(xiàn)類的全路徑名稱。java9對在引入模塊化后也支持在module-info.java里頭聲明service的提供方和消費者信息,這樣模塊系統(tǒng)可以支持ServiceLoader,不需要使用原來的META-INF那種聲明方式。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java 中maven pom.xml文件教程詳解
- Maven在Java8下如何忽略Javadoc的編譯錯誤詳解
- java如何使用自己的maven本地倉庫詳解
- Java使用Maven BOM統(tǒng)一管理版本號的實現(xiàn)
- Java項目打包發(fā)布到maven私倉常見的幾種方式
- 解決IDEA2020 創(chuàng)建maven項目沒有src/main/java目錄和webapp目錄問題
- Java如何通過Maven管理項目依賴
- 解決java maven項目找不到j(luò)console-1.8.0.jar和tools-1.8.0.jar包問題
- 基于Maven骨架創(chuàng)建JavaWeb項目過程解析
- Java程序測試上傳Maven工程代碼示例解析
- Java基礎(chǔ)之Maven詳解
相關(guān)文章
Spring boot2X Consul如何使用Feign實現(xiàn)服務(wù)調(diào)用
這篇文章主要介紹了spring boot2X Consul如何使用Feign實現(xiàn)服務(wù)調(diào)用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
Java中漢字轉(zhuǎn)拼音pinyin4j用法實例分析
這篇文章主要介紹了Java中漢字轉(zhuǎn)拼音pinyin4j用法,結(jié)合實例形式較為詳細的分析了pinyin4j庫的具體使用技巧,需要的朋友可以參考下2015-12-12
Java設(shè)計模式之代理模式原理及實現(xiàn)代碼分享
這篇文章主要介紹了Java設(shè)計模式之代理模式原理及實現(xiàn)代碼分享,設(shè)計代理模式的定義,靜態(tài)代理,動態(tài)代理,jdk動態(tài)代理實現(xiàn)步驟,原理及源碼等相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。2017-11-11
Spring Boot打jar包后配置文件的外部優(yōu)化配置方法
這篇文章主要介紹了Spring Boot打jar包后配置文件的外部優(yōu)化配置方法,需要的朋友可以參考下2018-02-02
Spring實戰(zhàn)之使用注解實現(xiàn)聲明式事務(wù)操作示例
這篇文章主要介紹了Spring實戰(zhàn)之使用注解實現(xiàn)聲明式事務(wù)操作,結(jié)合實例形式詳細分析了spring使用注解實現(xiàn)聲明式事務(wù)相關(guān)配置、接口實現(xiàn)與使用技巧,需要的朋友可以參考下2020-01-01

