【问题标题】:Using the maven assembly plugin with JOGL to create executable jar使用带有 JOGL 的 maven 程序集插件来创建可执行的 jar
【发布时间】:2014-02-13 03:39:55
【问题描述】:

我正在尝试为我的项目创建一个使用 JOGL 的可执行 jar。以前没有 JOGL,使用 maven-assembly-plugin 很容易。我的应用程序 pom 中有以下内容:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
    <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <archive>
        <manifest>
            <mainClass>org.jbox2d.testbed.framework.jogl.JoglTestbedMain</mainClass>
        </manifest>
    </archive>
</configuration>

在非 jogl 项目中,这会生成一个不错的 jbox2d-testbed-2.2.1.2-SNAPSHOT-jar-with-dependencies 可执行文件(当然,其中包含不同的主类)。

JOGL 项目使用 mavin 插件在 Eclipse 中运行良好,我包含了 jogl 依赖项,如 here in the wiki 所述。但是,当我在此项目上使用程序集插件并启动 jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies.jar 时,出现以下错误:

Catched FileNotFoundException: /Users/dmurph/Projects/jbox2d/jbox2d-testbed-jogl/target/jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies-natives-macosx-universal.jar (No such file or directory), while addNativeJarLibsImpl(classFromJavaJar class com.jogamp.common.os.Platform, classJarURI jar:file:/Users/dmurph/Projects/jbox2d/jbox2d-testbed-jogl/target/jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies.jar!/com/jogamp/common/os/Platform.class, nativeJarBaseName jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies-natives-macosx-universal.jar): [ file:/Users/dmurph/Projects/jbox2d/jbox2d-testbed-jogl/target/jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies.jar -> file:/Users/dmurph/Projects/jbox2d/jbox2d-testbed-jogl/target/ ] + jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies-natives-macosx-universal.jar -> slim: jar:file:/Users/dmurph/Projects/jbox2d/jbox2d-testbed-jogl/target/jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies-natives-macosx-universal.jar!/
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /System/Library/Frameworks/gluegen-rt.Framework/gluegen-rt
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
    at java.lang.Runtime.load0(Runtime.java:795)
    at java.lang.System.load(System.java:1062)
    at com.jogamp.common.jvm.JNILibLoaderBase.loadLibraryInternal(JNILibLoaderBase.java:551)
    at com.jogamp.common.jvm.JNILibLoaderBase.access$000(JNILibLoaderBase.java:64)
    at com.jogamp.common.jvm.JNILibLoaderBase$DefaultAction.loadLibrary(JNILibLoaderBase.java:96)
    at com.jogamp.common.jvm.JNILibLoaderBase.loadLibrary(JNILibLoaderBase.java:414)
    at com.jogamp.common.os.DynamicLibraryBundle$GlueJNILibLoader.loadLibrary(DynamicLibraryBundle.java:388)
    at com.jogamp.common.os.Platform$1.run(Platform.java:203)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.jogamp.common.os.Platform.<clinit>(Platform.java:173)
    at javax.media.opengl.GLProfile.<clinit>(GLProfile.java:82)
    at org.jbox2d.testbed.framework.jogl.JoglPanel.<init>(JoglPanel.java:52)
    at org.jbox2d.testbed.framework.jogl.JoglTestbedMain.main(JoglTestbedMain.java:62)

当我解压 jar 时,我看到了 JOGL 所需的所有 dll 和 jnilib 库,那么我需要做些什么才能让它工作吗?我知道 JOGL 使用单独的 jar 系统,我是否需要更改程序集插件的行为以便它可以正确生成额外的 jar?

如果您愿意,可以获取我的项目并尝试一下,它位于https://github.com/dmurph/jbox2d

谢谢!

【问题讨论】:

    标签: java maven jogl maven-assembly-plugin


    【解决方案1】:

    根据JOGL FAQ,您需要将本机库放置在胖罐内的特定位置。看起来你在 Mac 上,所以你需要把你的原生库放在这个目录中你的 jar

    natives/macosx-universal/
    

    正如@gouessej 所述,here is a complete list of supported architectures and required directories

    我认为您需要创建一个自定义Assembly Descriptor

    https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html
    

    编写您自己的描述符将允许您将罐子放置在特定位置,以获得您需要的包装。

    【讨论】:

    • 我尝试了这种方法将 JOGL 和 Gluegen jar 放在目标 jar 的根目录中,但 JOGL 仍然抱怨它无法加载本机组件。您能否给出适用于 JOGL 的明确说明?
    • 我已经更新了我的答案。您需要将本机库(.so 文件等)放在 jar 的 natives/macosx-universal/ 目录中。所有的罐子和其他所有东西都可以放在它们通常去的地方。这应该是你需要做的。
    • 我已经这样做了,但是 JOGL 的 JNI 加载器仍然无法找到本地人。从好的方面来说,至少我找到了一种纯 maven 方法,可以以正确的格式将 natives 目录包含到 JAR 中。
    • 你可能做错了什么。如果您遵循约定,GlueGen 肯定会找到本机库。 JBCP 是对的。
    【解决方案2】:

    您必须遵循精确的语义规则才能使其正常工作,以便 GlueGen 能够在 JAR 中定位本机库,提取并加载它们: http://forum.jogamp.org/Packaging-JOGL-projects-to-be-cross-platform-tp4031261p4031286.html

    【讨论】:

    • 在 Maven 中有没有办法做到这一点?
    • 使用我上面描述的程序集插件和自定义程序集描述符。这将为您提供将本机库放置在正确位置所需的控制权。
    • @JBCP 谢谢。我应该将这类信息放入 wiki 或用户指南中。
    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 2012-06-13
    • 2021-12-28
    • 1970-01-01
    • 2020-05-20
    • 2018-11-06
    • 2019-11-22
    • 1970-01-01
    相关资源
    最近更新 更多