使用maven构建java9 service实例详解

本篇文章主要介绍了使用maven构建java9 service实例详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

本文主要研究下如何在maven里头构建java9 multi module及service实例

maven

整个工程跟传统maven多module的工程结构一样,java9的一个module对应maven project的一个module。下面是根目录下的pom文件:

   4.0.0com.examplejava9-service-demo0.0.1-SNAPSHOT consumer-demoservice-sortservice-sort-bubbleservice-sort-mergepom UTF-899    org.apache.maven.pluginsmaven-compiler-plugin3.6.1 9

这里管理了一个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  List sortList(List list); public static SortService getProviderInstanceLazy() { Stream> providers = ServiceLoader.load(SortService.class) .stream(); //provider方法等到get的时候才会实例化 SortService service = providers.map(Provider::get) .findAny() .orElse(null); return service; } }

这里在声明接口的同时,也增加了静态方法,用于加载service实例。

service-sort-bubble

maven

    java9-service-democom.example0.0.1-SNAPSHOT4.0.0com.exampleservice-sort-bubblejar  com.exampleservice-sort0.0.1-SNAPSHOT

这里添加对api包的依赖

module-info.java

 module service.sort.bubble { requires service.sort; provides service.sort.SortService with sort.impl.bubble.BubbleSort; } 

这里声明了BubbleSort提供了SortService的实现

BubbleSort

 public class BubbleSort implements SortService { public  List sortList(List list) { System.out.println("use BubbleSort"); for (int outer = 0; outer  0) { swap(list, inner); } } } return list; } private  void swap(Listlist, int inner) { T temp = list.get(inner); list.set(inner, list.get(inner + 1)); list.set(inner + 1, temp); } } 

service-sort-merge

maven

    java9-service-democom.example0.0.1-SNAPSHOT4.0.0com.exampleservice-sort-mergejar  com.exampleservice-sort0.0.1-SNAPSHOT

module-info.java

 module service.sort.merge { requires service.sort; provides service.sort.SortService with sort.impl.merge.MergeSort; } 

这里声明了MergeSort为SortService接口的实现

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  List sortList(List list) { System.out.println("using MergeSort"); Collections.sort(list); return list; } } 

consumer

maven

    java9-service-democom.example0.0.1-SNAPSHOT4.0.0com.exampleconsumer-demojar  com.exampleservice-sort0.0.1-SNAPSHOT

注意这里没有添加实现类的依赖

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 data = new ArrayList(); 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

这里是在根目录下执行

使用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实现都添加

复制代码 代码如下:

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

发现貌似跟添加到path的顺序没有关系,即使把merge的jar包放在前面,也是使用bubble

小结

在java6的时候就已经有ServiceLoader了,不过那个时候是依赖在jar包的META-INF/services目录下创建一个service接口全路径名称的文件,里头写上实现类的全路径名称。java9对在引入模块化后也支持在module-info.java里头声明service的提供方和消费者信息,这样模块系统可以支持ServiceLoader,不需要使用原来的META-INF那种声明方式。

以上就是使用maven构建java9 service实例详解的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » Java