首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反射+库java

反射+库java
EN

Stack Overflow用户
提问于 2013-06-24 19:57:30
回答 2查看 355关注 0票数 2

编辑:这是项目设置:

IDE: Eclipse:

Project1:“服务器”

代码语言:javascript
复制
src:
com/mainpackage/main.java
libs:
commons-x-0.jar
PluginInterface.jar

libs-folder中的所有jar都在buildpath中。

Project2:"PluginInterface“

代码语言:javascript
复制
src:
com/interfaces/plugininterface

Project3:“插件”

代码语言:javascript
复制
src:
com/package/class1.java - (this implements plugininterface)
libs:
library1.jar
PluginInterface.jar

libs-folder中的所有jar都在buildpath中

因此,当我导出插件(Project3)时,我得到一个这样的jar (从导出中排除了PluginInterface.jar )

代码语言:javascript
复制
com/
com/package/
com/package/class1.class
com/package/class1.java
libs/
libs/library1.jar

library1.jar看起来像这样--它不是我写的:

代码语言:javascript
复制
com/
com/stuff/
com/stuff/libclass.java
com/stuff/libclass.class

现在我想通过接口在“服务器”中使用class1:

代码语言:javascript
复制
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,使其正常工作:

代码语言:javascript
复制
<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,它会在加载使用它们的类时找到它们。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-24 20:00:25

标准类加载器不支持嵌套的jar文件。您可以通过编程方式提取jar,或者编写您自己的类加载器,它将按需解压缩嵌套文件。然而,你会逆水行舟:这样的包装是不被推荐的。相反,建议将嵌套的jar分解为其父jar。例如,这就是Maven依赖插件所做的事情,也是使用Leiningen发布Clojure应用程序的默认方式。

要在Eclipse中实现目标,最好的方法似乎是:

  1. 让Eclipse的导出JAR向导保存它内部生成的用于构建JAR的ant构建脚本;
  2. 调整生成的脚本以满足您的特定需求;
  3. 将来不再运行该向导,而是运行ant脚本。
票数 11
EN

Stack Overflow用户

发布于 2013-07-01 22:37:46

正如Marko所提到的,您的标准类加载器不会扫描嵌套jars和其中的嵌套jars。但是,如果您愿意尝试使用TrueZip,那么您可以轻松地完成此操作,而不必提取归档文件或其他任何东西。更好的是,您可以在嵌套的归档中嵌入任意深度的归档。因此您的路径可能如下所示:

代码语言:javascript
复制
/path/to/foo.jar/bar/foo/my.zip/containing/some.tar/com/foo/My.class

如果您觉得使用TrueZip编写自己的类加载器很舒服,这将是一种很好的方法。如果不是,那么您必须编写一个实用程序类来解析路径并首先提取归档文件,然后再将其提供给标准URLClassloader

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17274906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档