反思+库java

bil*_*oor 2 java reflection

编辑:这是项目设置:

IDE:Eclipse:

Project1:"服务器"

src:
com/mainpackage/main.java
libs:
commons-x-0.jar
PluginInterface.jar
Run Code Online (Sandbox Code Playgroud)

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

Project2:"PluginInterface"

src:
com/interfaces/plugininterface
Run Code Online (Sandbox Code Playgroud)

Project3:"插件"

src:
com/package/class1.java - (this implements plugininterface)
libs:
library1.jar
PluginInterface.jar
Run Code Online (Sandbox Code Playgroud)

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

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

com/
com/package/
com/package/class1.class
com/package/class1.java
libs/
libs/library1.jar
Run Code Online (Sandbox Code Playgroud)

library1.jar看起来如下 - 它不是由我写的:

com/
com/stuff/
com/stuff/libclass.java
com/stuff/libclass.class
Run Code Online (Sandbox Code Playgroud)

现在我想在接口上的"服务器"中使用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();
Run Code Online (Sandbox Code Playgroud)

我现在可以使用项目知道的接口调用class1中的方法,因为它们都在buildpath中包含"PluginInterface.jar".

问题:

"服务器"不识别"libclass",因为它既不在其路径中,也不是从嵌套了library1的plugin.jar中加载类.

如果在服务器上无法导入库,我该如何访问此类?

谢谢你的帮助!

编辑:只是为了有人再次遇到这个问题,我将添加ANT文件的构建目标,使其工作:

<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>
Run Code Online (Sandbox Code Playgroud)

只需将Library-jar的内容复制到构建目录(在我的例子中为./bin/).然后甚至不需要将库类提供给类加载器,它在加载类时使用它们找到它们.

Mar*_*nik 11

标准类加载器不支持嵌套的jar文件.您可以以编程方式提取jar,或编写自己的类加载器,它将按需解压缩嵌套文件.但是,你会逆流而行:这种包装不推荐.相反,建议将嵌套jar分解为其父级.例如,这是Maven依赖插件的作用,以及使用Leiningen发布Clojure应用程序的默认方式.

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

  1. 让Eclipse的Export JAR向导保存它在内部生成的ant构建脚本来构建你的JAR;

  2. 调整生成的脚本以满足您的特定需求;

  3. 在将来不再运行向导,而是蚂蚁脚本.

  • (这是因为`ZipFile`不支持嵌套的拉链.你可以从任何来源读取带有`ZipInputStream`的zip文件.) (4认同)
  • @billdoor您的要求不会激励嵌套的JAR. (2认同)