编辑:这是项目设置:
IDE: Eclipse:
Project1:“服务器”
src:
com/mainpackage/main.java
libs:
commons-x-0.jar
PluginInterface.jarlibs-folder中的所有jar都在buildpath中。
Project2:"PluginInterface“
src:
com/interfaces/plugininterfaceProject3:“插件”
src:
com/package/class1.java - (this implements plugininterface)
libs:
library1.jar
PluginInterface.jarlibs-folder中的所有jar都在buildpath中
因此,当我导出插件(Project3)时,我得到一个这样的jar (从导出中排除了PluginInterface.jar )
com/
com/package/
com/package/class1.class
com/package/class1.java
libs/
libs/library1.jarlibrary1.jar看起来像这样--它不是我写的:
com/
com/stuff/
com/stuff/libclass.java
com/stuff/libclass.class现在我想通过接口在“服务器”中使用class1:
ClassLoader loader=URLClassLoader.newInstance(
new URL[]{new URL("file:path/to/plugin.jar")},
ClassLoader.getSystemClassLoader()
);
Class<?> pluginclass = Class.forName("com.package.class1", true, loader);
plugininterface ref = (plugininterface)pluginclass.newInstance();我现在可以使用两个项目都知道的接口从class1调用方法,因为它们都在构建路径中包含了"PluginInterface.jar“。
问题是:
“服务器”不能识别"libclass",因为它既不在它的路径中,也不是我从嵌套了library1的plugin.jar装入的类。
如果在服务器上不能导入as库,我如何访问这个类?
谢谢你的帮助!
编辑:如果有人再次遇到这个问题,我将添加ANT文件的build-target,使其正常工作:
<target name="build">
<javac destdir="bin" includeantruntime="false" source="1.7" target="1.7">
<src path="src"/>
<classpath refid="Plugin.classpath"/>
</javac>
<unzip src="${libs}/library1.jar" dest="bin/">
<patternset>
<include name="**/*.class"/>
</patternset>
</unzip>
<jar destfile="plugin.jar" basedir="bin"></jar>
</target>只需将Library-jar的内容复制到build目录(在我的例子中为./bin/)。它甚至不需要将库类提供给Classloader,它会在加载使用它们的类时找到它们。
发布于 2013-06-24 20:00:25
标准类加载器不支持嵌套的jar文件。您可以通过编程方式提取jar,或者编写您自己的类加载器,它将按需解压缩嵌套文件。然而,你会逆水行舟:这样的包装是不被推荐的。相反,建议将嵌套的jar分解为其父jar。例如,这就是Maven依赖插件所做的事情,也是使用Leiningen发布Clojure应用程序的默认方式。
要在Eclipse中实现目标,最好的方法似乎是:
发布于 2013-07-01 22:37:46
正如Marko所提到的,您的标准类加载器不会扫描嵌套jars和其中的嵌套jars。但是,如果您愿意尝试使用TrueZip,那么您可以轻松地完成此操作,而不必提取归档文件或其他任何东西。更好的是,您可以在嵌套的归档中嵌入任意深度的归档。因此您的路径可能如下所示:
/path/to/foo.jar/bar/foo/my.zip/containing/some.tar/com/foo/My.class如果您觉得使用TrueZip编写自己的类加载器很舒服,这将是一种很好的方法。如果不是,那么您必须编写一个实用程序类来解析路径并首先提取归档文件,然后再将其提供给标准URLClassloader。
https://stackoverflow.com/questions/17274906
复制相似问题