Java JPMS:如何让IntelliJ IDEA自动发现和编译服务模块的提供者模块?

Java JPMS:如何让IntelliJ IDEA自动发现和编译服务模块的提供者模块?,java,intellij-idea,service,java-9,java-module,Java,Intellij Idea,Service,Java 9,Java Module,我用IntelliJ IDEA开发了这个。这个项目是Java9服务模块的一个演示。我在Java9的“引入服务”一章中学习了模块化编程这本书 源代码 服务模块 模块名称:packt.sortutil public interface SortUtil { <T extends Comparable> List<T> sortList(List<T> list); } 类全名:packt.util.SortUtil public interface S

我用IntelliJ IDEA开发了这个。这个项目是Java9服务模块的一个演示。我在Java9的“引入服务”一章中学习了模块化编程这本书

源代码

  • 服务模块
  • 模块名称:
    packt.sortutil

    public interface SortUtil {
        <T extends Comparable> List<T> sortList(List<T> list);
    }
    
    类全名:
    packt.util.SortUtil

    public interface SortUtil {
        <T extends Comparable> List<T> sortList(List<T> list);
    }
    
    module-info.java:

    module packt.sort.bubblesort {
        requires packt.sortutil;
        provides packt.util.SortUtil with packt.util.impl.bubblesort.BubbleSortUtilImpl;
    }
    
    module packt.addressbook {
        requires packt.sortutil;
        uses packt.util.SortUtil; 
    }
    
    提供者模块2
    packt.sort.javasort
    是相同的,只是不同的实现不同

  • 用户模块
  • module-info.java:

    module packt.sort.bubblesort {
        requires packt.sortutil;
        provides packt.util.SortUtil with packt.util.impl.bubblesort.BubbleSortUtilImpl;
    }
    
    module packt.addressbook {
        requires packt.sortutil;
        uses packt.util.SortUtil; 
    }
    
    类别:

    package packt.util.impl.bubblesort;
    public class BubbleSortUtilImpl implements SortUtil 
    ...
    
    Iterable<SortUtil> sortUtils = ServiceLoader.load(SortUtil.class);
    for (SortUtil sortUtil : sortUtils){
        System.out.println("Found an instance of SortUtil");
        sortUtil.sortList(contacts);
    }
    
    然后我手动设置IntelliJ IDEA中的使用者模块(
    packt.addressbook
    )依赖于提供者模块(
    packt.sort.bubblesort
    packt.sort.javasort
    ,以蓝色突出显示)(仅在IDE中,就JPMS而言,使用者模块不依赖于提供者模块)。它现在可以正常工作了,尽管我不确定它是否是最好的解决方案


    另一方面,要显式添加这些模块,可以使用VM arg
    --添加模块provider1、provider2
    以上主要是为了确保从可观察模块集(显示在模块路径中)解析提供程序。另一方面,对于实际实现位的进一步参考,要显式添加这些模块,可以使用VM arg
    --add modules provider 1,provider 2
    ,以上主要是为了确保从可观察模块集(存在于modulepath中)解析提供程序。有关实际实现位的进一步参考