1

我有一个问题,我不知道如何正确解决。我正在为一个在启动时动态加载这些插件的程序开发插件。就我而言,一切都很顺利,因为我通常只使用主程序也使用过的依赖项,比如 Apache Commons。

现在我尝试使用 Google Guice,主程序在类路径中没有包,所以在启动时当然会出现 NoClassDefFoundError。我用谷歌一段时间来找到我的问题的解决方案,但我想出的唯一一件事就是使用一个 uber jar。这样做的问题是,我确实对我使用的其他插件有依赖关系,我不想将它们拉入我的插件,因为我最终不得不管理所有这些插件。甚至可能发生我在类路径中有两个不同的实现,因为我迷失了方向并且没有更新那个次要版本。不幸的是,通常没有其他插件的接口,所以我不能接受。

长文本,短问题:是否可以告诉 Maven 只在文件中提取 Guice,或者更好的是,是否有更简洁的解决方案来解决这个问题?也许我什至错过了整个过程中至关重要的事情?任何帮助表示赞赏。

4

2 回答 2

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>
于 2013-10-24T06:36:11.327 回答
0

由于主程序的类路径没有jave Guice jar,父类加载器不会加载Guice 包。如果子类加载器正在加载 Guice jar,那么主程序将不知道它。现在要解决这个问题,您可以执行以下任一操作:

  • 将 Guice jar 移动到主程序的类路径
  • 将使用 Guice jar 的代码部分添加到子类加载器(插件)
于 2013-10-23T06:06:43.557 回答