gpt4 book ai didi

java - 反射+java库

转载 作者:行者123 更新时间:2023-12-02 09:36:41 24 4
gpt4 key购买 nike

编辑:这是项目设置:

IDE:Eclipse:

项目1:“服务器”

src:
com/mainpackage/main.java
libs:
commons-x-0.jar
PluginInterface.jar

libs 文件夹中的所有 jar 都位于构建路径上。

项目2:“插件接口(interface)”

src:
com/interfaces/plugininterface

项目3:“插件”

src:
com/package/class1.java - (this implements plugininterface)
libs:
library1.jar
PluginInterface.jar

libs 文件夹中的所有 jar 都位于构建路径中

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

com/
com/package/
com/package/class1.class
com/package/class1.java
libs/
libs/library1.jar

library1.jar 如下所示 - 它不是我编写的:

com/
com/stuff/
com/stuff/libclass.java
com/stuff/libclass.class

现在我想通过接口(interface)在“服务器”中使用 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();

我现在可以使用两个项目都知道的接口(interface)调用 class1 中的方法,因为它们的构建路径中都包含“PluginInterface.jar”。

问题:

“Server”无法识别“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>

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

最佳答案

标准类加载器不支持嵌套 jar 文件。您可以通过编程方式提取 jar,或者编写自己的类加载器,它将根据需要解压缩嵌套文件。然而,您可能会逆流而上:不建议使用这种包装。相反,建议将嵌套 jar 分解到其父级中。例如,这就是 Maven 依赖插件的作用,也是使用 Leiningen 发布 Clojure 应用程序的默认方式。

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

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

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

  3. 以后不再运行向导,而是运行 ant 脚本。

关于java - 反射+java库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17274906/

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