2013-10-22 41 views
1

我有一个问题,我不知道如何正确解决它。我正在为一个程序开发插件,该程序在启动时动态加载这些插件。就我通常只使用主程序所使用的Apache Commons之类的依赖项而言,一切都很顺利。仅使用maven部署一些依赖关系

现在我试着玩谷歌Guice和主程序没有类路径中的包,所以当然有一个NoClassDefFoundError启动。我用谷歌一段时间来找到解决我的问题,但唯一的事情是使用超级罐子。问题在于,我确实对我使用的其他插件有依赖性,并且我不想将它们放入我的插件中,因为我最终不得不管理所有这些插件。它甚至可能发生,我在类路径中有两个不同的实现,因为我失去了跟踪并且没有更新该次要版本。不幸的是,通常没有其他插件的接口,所以我不能接受。

长文本,简短的问题:是否有可能告诉Maven只在文件中拉吉斯,或者更好的是,是否有更清晰的解决方案这个问题?也许我在整个过程中甚至错过了至关重要的事情?任何帮助表示赞赏。

+0

因此,您希望在运行时只需要一个特定的依赖包? (不在编译,测试)对不对? –

+0

我在编译时也需要它,所以它都是三个,编译,测试和运行时。 – Viciouss

+0

您可以使用程序集插件创建自定义程序集 –

回答

3

我刚刚发现了一个可行的解决方案。使用像这样的阴影插件会产生所需的结果:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.1</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <artifactSet> 
        <includes> 
         <include>com.google.inject:guice</include> 
        </includes> 
       </artifactSet> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
0

由于主程序的classpath不是jits Guice jar,父类加载器不会加载Guice包。如果孩子的类加载器正在加载Guice jar,那么主程序将不会有任何关于它的知识。现在,来解决这个问题,你可以做以下任意一种:

  • 移动吉斯罐子你的主程序
  • 萌的代码使用吉斯罐子子类加载器(插件)
部分的类路径
+1

主程序不使用Guice,这是我的问题。主程序没有这种依赖性,所以如果没有我想避免的胖罐子,我不能使用它。 – Viciouss

+0

那么你会在哪里得到NoClassDefFoundError? –

+0

这是当我加载插件。我把它放在插件文件夹中,启动程序,一旦主程序加载我的插件,它就尝试使用类加载器从类加载不在类路径中的模块类。 – Viciouss