簡體   English   中英

可執行 jar 具有依賴關系和 dll 依賴關系使用 maven

[英]Executable jar with dependencies and dll dependency using maven

I have a Java project using 4 OpenGL jars and 1 dll that I've received to work with as a Project for a course in Computer Graphics. I want to make maven build it for me into an executable jar so I could just git clone my repo from a different computer and build it using maven for execution. (最好使用maven clean install

到目前為止我做了什么:

  • 將 4 jars 和 dll 安裝到項目內的本地存儲庫中。 這樣,我只是設置依賴關系,文件是從 git 存儲庫復制的,例如:

     <repositories> <repository> <id>local-maven-repo</id> <url>file:///${project.basedir}/local-maven-repo</url> </repository> </repositories> <dependencies> <dependency> <groupId>com.computer.graphics</groupId> <artifactId>jogl</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>com.computer.graphics</groupId> <artifactId>gluegenrt</artifactId> <version>1.0</version> <scope>runtime</scope> <type>dll</type> </dependency>...
  • 在 src/assembly.xml 中設置帶有 assembly.xml 的 maven 程序集插件:

     <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <.-- Configure a class for executable jar --> <archive> <manifest> <mainClass>Main class</mainClass> </manifest> </archive> <:-- Points to the assembly descriptor to use --> <descriptors> <descriptor>src/assembly.xml</descriptor> </descriptors> </configuration> <!-- Bind goal assembly:single into build process --> <executions> <execution> <id>make-assembly</id> <!-- this is used for inheritance merges --> <phase>package</phase> <!-- bind to the packaging phase --> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
  • 嘗試將 jars 和 dll 包含到可執行文件 jar 中:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">

    <id>graphics-assembly</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>

    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>true</useProjectArtifact>
            <scope>runtime</scope>
            <unpack>true</unpack>
            <includes>
                <include>*:jar:*</include>
            </includes>
        </dependencySet>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>*:dll*</include>
            </includes>
        </dependencySet>
    </dependencySets>
</assembly>

From what I understood, the dll file should be in target folder near the executable jar, but even if I do copy manualy the file, when I try to run the jar using java -jar executable-jar.jar for example, I get the以下錯誤:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 1
        at jogamp.opengl.windows.wgl.awt.WindowsAWTWGLGraphicsConfigurationFactory.chooseGraphicsConfigurationImpl(WindowsAWTWGLGraphicsConfigurationFactory.java:170)
        at javax.media.nativewindow.GraphicsConfigurationFactory.chooseGraphicsConfiguration(GraphicsConfigurationFactory.java:422)
        at javax.media.opengl.awt.GLCanvas.chooseGraphicsConfiguration(GLCanvas.java:1516)
        at javax.media.opengl.awt.GLCanvas.addNotify(GLCanvas.java:614)
        at java.desktop/java.awt.Container.addNotify(Container.java:2801)
        at java.desktop/java.awt.Window.addNotify(Window.java:787)
        at java.desktop/java.awt.Frame.addNotify(Frame.java:493)
        at java.desktop/java.awt.Window.show(Window.java:1049)
        at java.desktop/java.awt.Component.show(Component.java:1720)
        at java.desktop/java.awt.Component.setVisible(Component.java:1667)
        at java.desktop/java.awt.Window.setVisible(Window.java:1032)
  • 我正在使用 intellij 並使用文件 -> 項目結構 -> 庫 -> 添加包含 jars 和 dll 的文件夾來簡單地鏈接文件。 當我使用 intellij 運行/構建項目時,一切正常。

我究竟做錯了什么? 有更好的方法嗎?

我最終從程序集文件中刪除了 dll 的依賴項集,並使用 maven-dependency-plugin 復制了 dll 依賴項,如下所示:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.1.2</version>
    <executions>
        <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
                <goal>copy</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <artifactItems>
            <artifactItem>
                <groupId>com.computer.graphics</groupId>
                <artifactId>gluegenrt</artifactId>
                <version>1.0</version>
                <type>dll</type>
                <outputDirectory>${project.build.directory}</outputDirectory>
                <destFileName>gluegen-rt.dll</destFileName>
            </artifactItem>
        </artifactItems>
    </configuration>
</plugin>

發生 ArrayIndexOutOfBoundsException 是因為我使用 jdk 16 而不是 jdk 12 來運行 jar。 希望這對其他人有幫助。

我最近遇到了同樣的問題。 這似乎是 jogl / jogamp 中的一些已知錯誤,但起初我並不清楚該怎么做。

只需將--illegal-access=permit添加到 VM-Options。 在我的示例中,它使用 OpenJDK-15 開箱即用,但在使用 OpenJDK-16 時我必須添加該 VM-Option。

我在使用 Jogamp 2.3.2 時遇到了同樣的異常,在 Jogamp 2.4.0 中,相同的修補程序有所幫助,但異常更改為:

Exception in thread "AWT-EventQueue-0" com.jogamp.opengl.GLException: Unable to determine GraphicsConfiguration: WindowsWGLGraphicsConfiguration[DefaultGraphicsScreen[WindowsGraphicsDevice[type .windows, connection decon, unitID 0, handle 0x0, owner false, NullToolkitLock[obj 0x1dc258d9]], idx 0], pfdID 7, ARB-Choosen true,
    requested GLCaps[rgba 8/8/8/0, opaque, accum-rgba 0/0/0/0, dp/st/ms 16/0/0, dbl, mono  , hw, GLProfile[GL4bc/GL4bc.hw], on-scr[.]],
    chosen    GLCaps[wgl vid 7 arb: rgba 8/8/8/0, opaque, accum-rgba 16/16/16/16, dp/st/ms 24/0/0, dbl, mono  , hw, GLProfile[GL4bc/GL4bc.hw], on-scr[.]]]
    at jogamp.opengl.windows.wgl.awt.WindowsAWTWGLGraphicsConfigurationFactory.chooseGraphicsConfigurationImpl(WindowsAWTWGLGraphicsConfigurationFactory.java:182)
    at com.jogamp.nativewindow.GraphicsConfigurationFactory.chooseGraphicsConfiguration(GraphicsConfigurationFactory.java:424)
    at com.jogamp.opengl.awt.GLCanvas.chooseGraphicsConfiguration(GLCanvas.java:1513)
    at com.jogamp.opengl.awt.GLCanvas.addNotify(GLCanvas.java:609)
    at java.desktop/java.awt.Container.addNotify(Container.java:2801)
    at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4792)
    at java.desktop/java.awt.Container.addNotify(Container.java:2801)
    at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4792)
    at java.desktop/java.awt.Container.addNotify(Container.java:2801)
    at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4792)
    at java.desktop/javax.swing.JRootPane.addNotify(JRootPane.java:729)
    at java.desktop/java.awt.Container.addNotify(Container.java:2801)
    at java.desktop/java.awt.Window.addNotify(Window.java:787)
    at java.desktop/java.awt.Frame.addNotify(Frame.java:493)
    at java.desktop/java.awt.Window.show(Window.java:1049)
    at java.desktop/java.awt.Component.show(Component.java:1720)
    at java.desktop/java.awt.Component.setVisible(Component.java:1667)
    at java.desktop/java.awt.Window.setVisible(Window.java:1032)
    at global.WindowSingleCanvas.createFrame(WindowSingleCanvas.java:122)
    at global.WindowSingleCanvas.setWindowType(WindowSingleCanvas.java:86)
    at global.WindowSingleCanvas.lambda$new$3(WindowSingleCanvas.java:39)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:316)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

另請參閱: http://forum.jogamp.org/JogAmp-Build-v2-4-0-rc-20210111-td4040955i20.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM