gpt4 book ai didi

java - 如何将常规jar添加到插件中(ClassNotFoundException,NoClassDefFoundError)?

转载 作者:行者123 更新时间:2023-11-29 07:04:44 26 4
gpt4 key购买 nike

我正在使用第三方代码,它使用一些 jar(实际上,这是 log4j)。运行我的插件时,出现多个错误 ClassNotFoundExceptionNoClassDefFoundError。由于第三方代码的使用还仅限于一些ViewPart,所以程序运行了,但是view没有被实例化。

在 Eclipse 的编译时,我像往常一样将所需的 jar 添加到类路径中,并且代码在编译时没有任何错误,包括 log4jimport 指令。

由于我将所有(许多)所需的 jar 放入项目目录的 lib 子目录中,所以我想修改 build.properties 如下

source.. = src/
output.. = bin/
bin.includes = plugin.xml,\
META-INF/,\
lib/,\
.

但显然这没有帮助。

我在哪里可以看到我的整个包/插件编译打包以检查其中包含哪些 jars?

更新

目前我放了两次所需的 jar 。

第一个 -- 进入正常的 Eclipse Configure Build Path 窗口:

enter image description here

第二个 -- 进入 plugin.xml 编辑器的 Runtime 选项卡的 Classpath 部分:

enter image description here

后一个配置在 build.properties 文件中进行了以下更改:

source.. = src/
output.. = bin/
bin.includes = plugin.xml,\
META-INF/,\
lib/,\
.,\
lib/java-getopt-1.0.13.jar,\
lib/jsp-api-2.0.jar,\
lib/junit-4.11.jar,\
lib/log4j-1.2.17.jar,\
lib/rhino-1.7R4.jar,\
lib/servlet-api-6.0.36.jar,\
lib/tomcat-catalina-7.0.42.jar,\
lib/commons-logging-1.1.3.jar,\
lib/spring-beans-3.2.0.RELEASE.jar,\
lib/spring-core-3.2.0.RELEASE.jar,\
lib/miglayout-core-4.2.jar,\
lib/miglayout-swt-4.2.jar,\
conf/

那么是否有可能自动化呢?是否可以自动将所有常规类路径条目传递给运行时?

我需要SIMPLIFICATION,我不想将 jar 包装成包或类似的东西。

问题开放。

最佳答案

要导出插件,您可以使用文件菜单 -> 导出 -> 插件开发/可部署插件和片段。然后选择您的插件,它将作为 jar 导出。要导出产品,.product 文件中有一个产品导出选项。

我建议您使用“新建项目”向导中的“来自现有 JAR 存档的插件”选项创建一个单独的插件。如果是这样,那么我希望您不要忘记将它包含到您的运行配置中。另外,请检查this question了解更多详情。

更新:您既不需要也不会被迫将 jar 包转换为包,但由于您不是在创建纯 Java 项目(您有一个 OSGI 包,它有自己的类加载器和生命周期),您可能需要考虑一些最佳实践/规则,这可以帮助您创建一个好的插件/项目。

Why you need to convert dependencies to bundles?

You already have your third party dependency (log4j, apache commons collections etc.,) as jars and all you need to do is add it to your bundle classpath. This is simple and it works as long as you are developing only one bundle or your bundles do not share common dependencies.

But, in reality, you might be creating a bunch of bundles and they all would use common dependencies. The problem here is in the way OSGi classloading works. Each bundle has it's own classloader and so if you have two bundles both using log4j as jar dependency in their classpath, and when you try to reference log4j in each of the bundles, each would try create their own instances of the log4j classes in their respective classloaders. This might cause classloader constraint violation issues or ClassCastExceptions. If you convert these dependencies to OSGi bundles, then these problems would no longer happen. This is because now each of your dependency (say log4j) has it's own classloader and so whenever your Bundle A or Bundle B want to load log4j class, it will load it from log4j bundle classloader.

请引用this article获取更多信息。

关于自动化过程:我认为这是不可能的。由于您手动将 jars 添加到 lib 文件夹,因此您应该将它们手动添加到类路径(在 Runtime 部分)。但是,在 build.includes 配置中定义 lib/ 应该在某些时候有所帮助。另外,可能是 this会有所帮助。请注意,您不需要像往常一样“将 jar 添加到构建路径”!将其添加到 Runtime 部分(您的第二个屏幕截图),将为您将其添加到构建路径。

此外,请注意,在您的屏幕截图中,"." 不在 Runtime 配置部分的顶部。

关于java - 如何将常规jar添加到插件中(ClassNotFoundException,NoClassDefFoundError)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21068483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com