繁体   English   中英

ClassNotFoundException在Eclipse构建路径中使用另一个jar文件时(minecraft插件)

[英]ClassNotFoundException When using another jar file in eclipse build path (minecraft plugin)

我正在尝试使用作为我当前项目的API制作的.JAR文件。 是API的GitHub页面, 是我正在使用的插件的代码。

我收到这些错误:

04.01 17:32:03 [Server] INFO Caused by: java.lang.NoClassDefFoundError: me/Andrew/XenforoAPI/SiteAPI
04.01 17:32:03 [Server] INFO at me.Andrew.BreezeSiteLink.APICaller.postApplication(APICaller.java:16) ~[?:?]
04.01 17:32:03 [Server] INFO at me.Andrew.BreezeSiteLink.Main.onCommand(Main.java:84) ~[?:?]
04.01 17:32:03 [Server] INFO at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot.jar:git-Spigot-5391d73-0ebb9c7]
04.01 17:32:03 [Server] INFO ... 15 more
04.01 17:32:03 [Server] INFO Caused by: java.lang.ClassNotFoundException: me.Andrew.XenforoAPI.SiteAPI
04.01 17:32:03 [Server] INFO at java.net.URLClassLoader$1.run(URLClassLoader.java:359) ~[?:1.7.0_121]
04.01 17:32:03 [Server] INFO at java.net.URLClassLoader$1.run(URLClassLoader.java:348) ~[?:1.7.0_121]
04.01 17:32:03 [Server] INFO at java.security.AccessController.doPrivileged(Native Method) ~[?:1.7.0_121]
04.01 17:32:03 [Server] INFO at java.net.URLClassLoader.findClass(URLClassLoader.java:347) ~[?:1.7.0_121]
04.01 17:32:03 [Server] INFO at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:101) ~[spigot.jar:git-Spigot-5391d73-0ebb9c7]

在Eclipse中,选中了“导出为JAR文件”(但未选中“可运行的JAR文件”)。

如何解决此问题并获取与插件一起编译的API?

右键单击您的项目-> Java构建路径->库->添加外部Jar

然后,您可以选择要与您的项目一起使用的jar / api,但也不要忘记将其添加到plugin.yml的依赖项中:

depend: [Plugin1, Plugin2...]

如前所述,该错误是您的插件未找到您的API库的结果。 在大多数情况下,我建议您在插件的JAR中包含该依赖项。

但是,如果此API(本身不是插件)被多个插件使用,请在服务器根目录创建一个lib目录,并将您的API JAR放在其中。 Bukkit / Spigot将加载此目录中的所有JAR文件,并且可用于所有插件。

编辑:

正如我在评论中提到的那样,我使用这种技术已有很长时间了,我认为它是Bukkit的功能。 las,不是。

在MANIFEST.MF中添加类路径

将以下maven-jar-plugin配置添加到您的POM,可确保将具有compile范围的所有依赖项添加到插件的类路径中。 类路径是相对于插件位置( plugin目录)的,因此../lib/是服务器根目录中的lib目录。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <archive>
            <manifestEntries>
                 <Built-By>You</Built-By>
            </manifestEntries>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>../lib/</classpathPrefix>
            </manifest>
        </archive>
     /configuration>
</plugin>

本质上,这会在插件的META-INF/MANIFEST.MF创建一个条目,该条目引用您的API库,类似于以下内容:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: You
Class-Path: ../lib/my-api.jar
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_73

创建一个Uber-JAR

上面的解决方案对我们来说效果很好,它提供了一个单一的位置来维护几个内部插件使用的库。 然后,再次运行我们自己的服务器。

如果您的长期计划是发布插件供他人使用,则此解决方案不是理想的选择。 尽管可以正常运行,但除非自动执行API库的安装,否则服务器操作员还需要进行其他工作。 再说一次,安装除服务器操作员期望之外的文件可能也不是一个好主意。

更好的解决方案是创建一个uber-JAR,其中包括您的代码和任何唯一的依赖项,例如您的API。 如上例所示,它无需安装API JAR。 更重要的是,它可以避免在发行新版本的插件时可能出现的版本不匹配的情况。

将以下maven-shade-plugin配置添加到您的POM,将创建一个uber-JAR,它在单个JAR中包含您的插件和API类以及接口。 该示例假设您的API具有Maven协调我me.andy:myapi:1.0

<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>
                <minimizeJar>true</minimizeJar>
                <filters>
                    <filter>
                        <artifact>me.andy:myapi:1.0</artifact>
                        <includes>
                            <include>**</include>
                        </includes>
                    </filter>
                </filters>
            </configuration>
        </execution>
    </executions>
</plugin>

运行mvn install您将在target目录中找到三个JAR文件(文件名显然会有所不同):

  • original-myplugin-1.0.jar原始JAR,因为它通常会被创建。
  • myplugin-1.0-shaded.jar组合的JAR
  • myplugin-1.0.jar具有减少的依赖关系的组合JAR。 这是最终的插件JAR。

您可以验证任何流行的ZIP工具所包含的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM