【问题标题】:Dynamically loading a JAR on a maven based project在基于 maven 的项目上动态加载 JAR
【发布时间】:2018-10-10 21:13:01
【问题描述】:

我正在尝试修复此异常:无法在 32 位 JVM 上加载 64 位 SWT 库

我的项目是基于 maven 的,我在 pom.xml 文件中声明了两个依赖项(SWT 32 位和 SWT 64 位)。

我正在尝试使用以下函数基于 Java 架构数据模型(sun.arch.data.model 属性)动态加载正确的 JAR:

private static synchronized void loadLibrary(File jar) {
    try {
        URLClassLoader loader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        URL url = jar.toURI().toURL();

        for (URL it : Arrays.asList(loader.getURLs())) {
            if (it.equals(url)) {
                return;
            }
        }

        Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
        method.setAccessible(true);
        method.invoke(loader, new Object[]{url});
    } catch (Exception e) {
        System.out.println("error");
    }
}

问题是我不知道如何指定 JAR 的路径。我看到 JAR 已下载到 .m2 文件夹中,但我想我无法指定该路径。我的猜测是,如果 JNLP 将下载 JAR,我应该指定 Java 缓存的路径。我说的对吗?

【问题讨论】:

  • 你用的是什么IDE?
  • 我正在使用 Netbeans

标签: java maven jar swt


【解决方案1】:

我会为您的工件创建单独的 32 位和 64 位版本。这可以通过将 swt 依赖项包装到配置文件中来实现(您可以称它们为 32bit64bit),然后激活合适的配置文件。然后,您可以生成两个不同名称或版本(或分类器)的工件。

【讨论】:

  • 你好。谢谢您的回答。我实际上正在寻找一种更快更简单的方法来做到这一点。上下文是我正在使用 JWebBrowser 在我的应用程序中显示一些 Youtube 视频,这是应用程序中架构之间唯一存在差异的地方,我认为通过加载适当的 JAR 我可以快速解决这个问题并将其部署到用户。我知道这是一个 hack,但我想快速完成。附:好的答案,谢谢。
【解决方案2】:

我通过这样做解决了这个问题:我已经下载了 32 位和 64 位 jar 并将它们放在我的项目的资源文件夹中(/swt/swt_x86.jar 和 /swt/swt_x86_64.jar)。然后,在需要jar的地方,我使用主题中提到的函数,根据Java架构加载它。

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 2021-10-25
    • 2012-08-14
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2016-09-01
    相关资源
    最近更新 更多