【问题标题】:How to prevent jar-in-jar-loader loading specific class?如何防止 jar-in-jar-loader 加载特定的类?
【发布时间】:2012-12-04 12:48:38
【问题描述】:

假设我有一个文件夹的以下项目结构

  • 一个
  • B
  • C

还有许多外部罐子。

现在我正在尝试构建两个不同的可执行 jar,例如 A+B、A+C。

首先,我执行 Eclipse -> Export -> Executable Jar 并为 Ant 保存脚本。所以它会生成 Ant-script 和 jar-in-jar-loader。现在我修改 ant 脚本以排除文件夹 B

    <fileset dir="C:/Users/Nikolay/bin">
        <exclude name="org/B"/>
    </fileset>

并保持jar-in-jar-loader.zip 文件未修改。

构建jar后运行会出现这个错误:

    Exception in thread "main" java.lang.NoClassDefFoundError: org/B
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:56)
Caused by: java.lang.ClassNotFoundException: org.B
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        ... 3 more

但我确信A中没有使用B类。

似乎JarRscrLoader 试图在应用程序启动时加载所有列出的类。 如何防止这种情况发生?

请不要建议我将 Eclipse 中的代码拆分为 2-3 个项目。

【问题讨论】:

    标签: java eclipse jar classloader classnotfoundexception


    【解决方案1】:

    创建两个不同的运行配置(运行 --> 运行配置...)并根据您的要求修改类路径选项卡中包含的库。

    导出项目时,只需选择合适的配置即可。

    【讨论】:

    • 这不是关于库,而是关于类或文件夹
    • 哦,对不起。如果您选择“将所需的库提取到生成的 JAR 中”会发生什么?至少对我来说,Eclipse 不包括它的 jar-in-jar 加载器,因此没有自定义类加载器。还请检查生成的 .jar 文件中的 META-INF 目录是否有任何依赖项。
    • 似乎在 Eclipse 运行配置中我无法配置为从构建路径中排除特定类。在 META-INF 中,类没有依赖关系,只有库。
    猜你喜欢
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 2020-06-02
    相关资源
    最近更新 更多