2017-06-13 129 views
1

设置: 在我们公司,我尝试将基于Ant的Netbeans应用程序迁移到Maven。 我有一个基于Maven的Netbeans平台应用程序和两个包含Netbeans模块的Maven Module POM项目。Maven Netbeans应用程序未找到ServiceProvider

|API (POM project) 
|-APIModule 
    |-MyService.java 
|Implementation (POM project) 
|-ImplModule (dependency on APIModule) 
    |-MyServiceProvider.java (implements MyService) 
|Application (Maven Netbeans Platform Application) (dependency on API and Implementation) 
|-branding 
|-netbeans-app (the application) 
|-viewer 
    |-MyViewer.java (calls Lookup.getDefault().lookup(MyService.class) 

API和实现使用<packaging>pom</packaging>建成,并依赖使用

<dependencies> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>mavenprojectapi</artifactId> 
      <version>${project.version}</version> 
      <type>pom</type> 
     </dependency> 
    </dependencies> 

这样宣布,我可以很容易地换出实现在API部分服务,并建立是否有新UI我不想再坚持Netbeans平台。

问题:在MyViewer中,我打电话给Lookup.getDefault().lookup(MyService.class)

但它没有找到MyService的实现。

我知道@ServiceProvider找到实现,如果它们被明确声明(例如见here),但这不是我想要的。

问题:如何查找通过查找和ServiceProvider 定义的服务实现,这些实现是在其他模块套件中定义的?

UPDATE:似乎传递依赖不会从Implementation项目加载。我可以做的是定义一个Netbeans聚合模块,它对所有实现模块都有明确的依赖关系,并将其声明为我的应用程序中的直接依赖项。这种方式传递性依赖被加载并找到了ServiceProviders。

虽然我在想要复制了基于Ant的项目中的“导入集群”功能。在official NBM plugin documentation中描述了目标,并且为单个模块构建集群,但我不知道访问它们的方法。有任何想法吗?

回答

0

将Implementation模块的模块类型更改为eager。

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>nbm-maven-plugin</artifactId> 
    ... 
    <configuration> 
     <moduleType>eager</moduleType> 
     ... 
    </configuration> 
</plugin> 
+0

不幸的是,这并没有摆脱这个问题。我编辑并更新了我的问题。 – sarathas