我有一个问题,我不知道如何正确解决它。我正在为一个在启动时动态加载这些插件的程序开发插件。到目前为止,一切都很顺利,因为我通常只使用像主要程序一样使用的Apache Commons等依赖项。
现在我尝试使用Google Guice并且主程序在类路径中没有包,因此启动时会出现NoClassDefFoundError。我使用谷歌一段时间来找到解决我问题的方法但我唯一想到的就是使用超级罐。问题是,我确实依赖于我使用的其他插件,我不想在我的插件中插入它们,因为我最终必须管理所有这些插件。甚至可能发生我在类路径中有两个不同的实现,因为我丢失了跟踪并且没有更新那个次要版本。不幸的是,通常没有其他插件的接口,所以我不能接受它。
长篇文章,简短的问题:是否可以告诉Maven只在文件中提取Guice,或者更好的是,是否有更清晰的解决方案来解决这个问题?也许我甚至错过了整个过程中至关重要的事情?任何帮助表示赞赏。
答案 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>
答案 1 :(得分:0)
由于主程序的类路径没有jave Guice jar,因此父类加载器不会加载Guice包。如果子类加载器正在加载Guice jar,那么主程序将不知道它。现在要解决这个问题,您可以执行以下任一操作: