2015-10-02 38 views
1

我有一个问题有点难以解释,但我会尽我所能去做。如果您不了解任何内容或需要更多信息,请随时提问。 :)Maven和java插件框架

我有一个java项目,使用java插件框架。这意味着我在项目的类路径中搜索具有特定结构的项目。 我有这个需要的结构,并包含在主体工程的pom.xml作为依赖这样的两个项目:

loader = ServiceLoader.load(ISomeInterface.class); 
loader.iterator(); 

<dependency> 
    <groupId>package</groupId> 
    <artifactId>One</artifactId> 
    <version>1.0</version> 
</dependency> 
<dependency> 
    <groupId>package</groupId> 
    <artifactId>Two</artifactId> 
    <version>1.0</version> 
</dependency> 

我通过的ServiceLoader这样的检索可用类

我的问题是,ServiceLoader.load调用只提供我的pom.xml中首先提到的项目。

有没有人做过类似的经历,或者可以帮助我解决这个问题?

由于提前, 洛里斯

+0

在运行时都依赖关系存在,并且可以通过访问当前线程的Classloader? – hotzst

+0

不,如果我使用eclipse运行我的应用程序,一切都像魅力一样。如果我使用maven构建项目,它只能找到在pom.xml中首先提到的项目。 有趣的是,两个项目的每个类都包含在最终的jar文件中。 – LorisBachert

+0

也许是类加载器的问题?从构建中可以访问不同的类路径树。 > https://cwiki.apache.org/confluence/display/MAVEN/Maven+3.x+Class+Loading > http://stackoverflow.com/questions/4443345/maven-plugin-classloading > http ://trasahin.blogspot.de/2011/11/java-class-loader-and-maven-plugin.html 只是猜测... –

回答

0

我发现这个问题并解决它! 问题是我的每个插件都包含一个名为“META-INF/full.qualified.interface”的文件,其内容为“full.qualified.interfaceimplementation”。 Maven只打包第一个项目的文件,而不是合并每个项目的文件内容。 因此,所有你需要做的是配置Maven合并发现用窗帘插件所有的“META-INF/full.qualified.interface”文件:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.1</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <transformers> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 
       </transformers> 
      </configuration> 
     </execution> 
    </executions> 
</plugin>