使用maven構(gòu)建java9 service實(shí)例詳解
序
本文主要研究下如何在maven里頭構(gòu)建java9 multi module及service實(shí)例
maven
整個(gè)工程跟傳統(tǒng)maven多module的工程結(jié)構(gòu)一樣,java9的一個(gè)module對(duì)應(yīng)maven project的一個(gè)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>
這里管理了一個(gè)maven-compiler-plugin,配置release為9,因?yàn)閖ava9支持multi release,可以同時(shí)支持多個(gè)java版本,這里編譯為java9版本。
service-sort
這個(gè)是service接口module
module service.sort { exports service.sort; uses service.sort.SortService; }
這里同時(shí)聲明uses SortService表示是它需要在這個(gè)module里頭使用ServiceLoader去加載service實(shí)例
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的時(shí)候才會(huì)實(shí)例化 SortService service = providers.map(Provider::get) .findAny() .orElse(null); return service; } }
這里在聲明接口的同時(shí),也增加了靜態(tài)方法,用于加載service實(shí)例。
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>
這里添加對(duì)api包的依賴
module-info.java
module service.sort.bubble { requires service.sort; provides service.sort.SortService with sort.impl.bubble.BubbleSort; }
這里聲明了BubbleSort提供了SortService的實(shí)現(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接口的實(shí)現(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>
注意這里沒有添加實(shí)現(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"); } }
編譯及運(yùn)行
編譯
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
兩個(gè)service實(shí)現(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的時(shí)候就已經(jīng)有ServiceLoader了,不過那個(gè)時(shí)候是依賴在jar包的META-INF/services目錄下創(chuàng)建一個(gè)service接口全路徑名稱的文件,里頭寫上實(shí)現(xiàn)類的全路徑名稱。java9對(duì)在引入模塊化后也支持在module-info.java里頭聲明service的提供方和消費(fèi)者信息,這樣模塊系統(tǒng)可以支持ServiceLoader,不需要使用原來的META-INF那種聲明方式。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java 中maven pom.xml文件教程詳解
- Maven在Java8下如何忽略Javadoc的編譯錯(cuò)誤詳解
- java如何使用自己的maven本地倉庫詳解
- Java使用Maven BOM統(tǒng)一管理版本號(hào)的實(shí)現(xiàn)
- Java項(xiàng)目打包發(fā)布到maven私倉常見的幾種方式
- 解決IDEA2020 創(chuàng)建maven項(xiàng)目沒有src/main/java目錄和webapp目錄問題
- Java如何通過Maven管理項(xiàng)目依賴
- 解決java maven項(xiàng)目找不到j(luò)console-1.8.0.jar和tools-1.8.0.jar包問題
- 基于Maven骨架創(chuàng)建JavaWeb項(xiàng)目過程解析
- Java程序測(cè)試上傳Maven工程代碼示例解析
- Java基礎(chǔ)之Maven詳解
相關(guān)文章
Spring boot2X Consul如何使用Feign實(shí)現(xiàn)服務(wù)調(diào)用
這篇文章主要介紹了spring boot2X Consul如何使用Feign實(shí)現(xiàn)服務(wù)調(diào)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Java中漢字轉(zhuǎn)拼音pinyin4j用法實(shí)例分析
這篇文章主要介紹了Java中漢字轉(zhuǎn)拼音pinyin4j用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了pinyin4j庫的具體使用技巧,需要的朋友可以參考下2015-12-12Java設(shè)計(jì)模式之代理模式原理及實(shí)現(xiàn)代碼分享
這篇文章主要介紹了Java設(shè)計(jì)模式之代理模式原理及實(shí)現(xiàn)代碼分享,設(shè)計(jì)代理模式的定義,靜態(tài)代理,動(dòng)態(tài)代理,jdk動(dòng)態(tài)代理實(shí)現(xiàn)步驟,原理及源碼等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11Spring Boot打jar包后配置文件的外部?jī)?yōu)化配置方法
這篇文章主要介紹了Spring Boot打jar包后配置文件的外部?jī)?yōu)化配置方法,需要的朋友可以參考下2018-02-02超全MyBatis動(dòng)態(tài)代理詳解(絕對(duì)干貨)
這篇文章主要介紹了超全MyBatis動(dòng)態(tài)代理詳解(絕對(duì)干貨),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Spring實(shí)戰(zhàn)之使用注解實(shí)現(xiàn)聲明式事務(wù)操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用注解實(shí)現(xiàn)聲明式事務(wù)操作,結(jié)合實(shí)例形式詳細(xì)分析了spring使用注解實(shí)現(xiàn)聲明式事務(wù)相關(guān)配置、接口實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2020-01-01