使用maven构建java9 service实例详解
序
本文主要研究下如何在maven里头构建java9multimodule及service实例
maven
整个工程跟传统maven多module的工程结构一样,java9的一个module对应mavenproject的一个module。下面是根目录下的pom文件:
4.0.0 com.example java9-service-demo 0.0.1-SNAPSHOT consumer-demo service-sort service-sort-bubble service-sort-merge pom UTF-8 9 9 org.apache.maven.plugins maven-compiler-plugin 3.6.1 9
这里管理了一个maven-compiler-plugin,配置release为9,因为java9支持multirelease,可以同时支持多个java版本,这里编译为java9版本。
service-sort
这个是service接口module
moduleservice.sort{ exportsservice.sort; usesservice.sort.SortService; }
这里同时声明usesSortService表示是它需要在这个module里头使用ServiceLoader去加载service实例
publicinterfaceSortService{ publicList sortList(List list); publicstaticSortServicegetProviderInstanceLazy(){ Stream >providers=ServiceLoader.load(SortService.class) .stream(); //provider方法等到get的时候才会实例化 SortServiceservice=providers.map(Provider::get) .findAny() .orElse(null); returnservice; } }
这里在声明接口的同时,也增加了静态方法,用于加载service实例。
service-sort-bubble
maven
java9-service-demo com.example 0.0.1-SNAPSHOT 4.0.0 com.example service-sort-bubble jar com.example service-sort 0.0.1-SNAPSHOT
这里添加对api包的依赖
module-info.java
moduleservice.sort.bubble{ requiresservice.sort; providesservice.sort.SortServicewithsort.impl.bubble.BubbleSort; }
这里声明了BubbleSort提供了SortService的实现
BubbleSort
publicclassBubbleSortimplementsSortService{ publicList sortList(List list){ System.out.println("useBubbleSort"); for(intouter=0;outer 0){ swap(list,inner); } } } returnlist; } private voidswap(List list,intinner){ Ttemp=list.get(inner); list.set(inner,list.get(inner+1)); list.set(inner+1,temp); } }
service-sort-merge
maven
java9-service-demo com.example 0.0.1-SNAPSHOT 4.0.0 com.example service-sort-merge jar com.example service-sort 0.0.1-SNAPSHOT
module-info.java
moduleservice.sort.merge{ requiresservice.sort; providesservice.sort.SortServicewithsort.impl.merge.MergeSort; }
这里声明了MergeSort为SortService接口的实现
MergeSort
importjava.util.List; importjava.util.ArrayList; importjava.util.Collections; importjava.util.Arrays; importservice.sort.SortService; publicclassMergeSortimplementsSortService{ publicList sortList(List list){ System.out.println("usingMergeSort"); Collections.sort(list); returnlist; } }
consumer
maven
java9-service-demo com.example 0.0.1-SNAPSHOT 4.0.0 com.example consumer-demo jar com.example service-sort 0.0.1-SNAPSHOT
注意这里没有添加实现类的依赖
module-info.java
moduleconsumer{ requiresservice.sort; }
Main
publicclassMain{ publicstaticvoidmain(String[]args){ System.out.println("sortserviceconsumerstarted."); Listdata=newArrayList (); data.add(5); data.add(3); data.add(10); data.add(2); data.add(8); SortServicesortService=SortService.getProviderInstanceLazy(); if(sortService!=null){ sortService.sortList(data); } System.out.println(data); System.out.println("finish"); } }
编译及运行
编译
mvncleaninstall
这里是在根目录下执行
使用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--moduleconsumer/consumer.Main
注意这里添加了bubble的jar到module-path
输出
sortserviceconsumerstarted.
useBubbleSort
[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--moduleconsumer/consumer.Main
注意这里添加了merge的jar到module-path
输出
sortserviceconsumerstarted.
usingMergeSort
[2,3,5,8,10]
finish
两个service实现都添加
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--moduleconsumer/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--moduleconsumer/consumer.Main
输出
sortserviceconsumerstarted.
useBubbleSort
[2,3,5,8,10]
finish
发现貌似跟添加到path的顺序没有关系,即使把merge的jar包放在前面,也是使用bubble
小结
在java6的时候就已经有ServiceLoader了,不过那个时候是依赖在jar包的META-INF/services目录下创建一个service接口全路径名称的文件,里头写上实现类的全路径名称。java9对在引入模块化后也支持在module-info.java里头声明service的提供方和消费者信息,这样模块系统可以支持ServiceLoader,不需要使用原来的META-INF那种声明方式。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。