“java.library.path中没有lwjgl”

时间:2014-10-23 06:41:25

标签: java eclipse maven lwjgl

环顾四周并阅读其他类似的帖子,我一直无法解决我作为依赖关系而对LWJGL的问题。我将尝试尽可能具有描述性和信息性,所以,谢谢你提前做出任何回应。

目标:在Eclipse中创建依赖于LWJGL( Version 2.9.1 )的项目(版本:Luna Service Release 1(4.4.1)< / em>)使用Maven 2( M2E 1.5.0插件)。

到目前为止,我已经使用M2E在Eclipse中将我的项目设置为Maven项目。

我在阅读了关于Eclipse + Maven + LWJGL主题的各篇文章/帖子之后设置了我的pom.xml,结果如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<!-- Supported POM Version -->
<modelVersion>4.0.0</modelVersion>

<!-- Project Information -->
<groupId>HIDDEN.GROUP.ID</groupId>
<artifactId>HIDDEN.ARTIFACT.ID</artifactId>
<version>0.1.0</version>
<name>HIDDEN.NAME</name>
<description>HIDDEN DESCRIPTION</description>

<!-- Build Properties -->
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <lwjgl-version>2.9.1</lwjgl-version>
    <main>HIDDEN.MAIN.CLASS</main>
</properties>

<!-- Dependencies -->
<dependencies>
    <dependency>
        <groupId>org.lwjgl.lwjgl</groupId>
        <artifactId>lwjgl</artifactId>
        <version>${lwjgl-version}</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.lwjgl.lwjgl</groupId>
        <artifactId>lwjgl_util</artifactId>
        <version>${lwjgl-version}</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
</dependencies>

<!-- Build Configuration -->
<build>
    <finalName>${project.name}</finalName>
    <defaultGoal>clean package</defaultGoal>
    <sourceDirectory>src</sourceDirectory>

    <!-- Resources -->
    <resources>
        <resource>
            <targetPath>.</targetPath>
            <directory>${basedir}/src/main/resources/</directory>
            <filtering>true</filtering>
            <includes>
                <!-- Include All HOCON Resources -->
                <include>*.config</include>
            </includes>
        </resource>
    </resources>

    <!-- Plugins -->
    <plugins>

        <!-- Maven Compiler -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <showDeprecation>true</showDeprecation>
            </configuration>
        </plugin>

        <!-- Maven Shader -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <artifactSet>
                            <includes>
                                <include>org.lwjgl.lwjgl:*</include>
                            </includes>
                        </artifactSet>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                    <Main-Class>${main}</Main-Class>
                                </manifestEntries>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- Maven Natives -->
        <plugin>
            <groupId>com.googlecode.mavennatives</groupId>
            <artifactId>maven-nativedependencies-plugin</artifactId>
            <version>0.0.6</version>
            <executions>
                <execution>
                    <id>unpacknatives</id>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <pluginManagement>
        <plugins>
            <!--This plugin's configuration is used to store Eclipse m2e settings 
                only. It has no influence on the Maven build itself. -->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>
                                        com.googlecode.mavennatives
                                    </groupId>
                                    <artifactId>
                                        maven-nativedependencies-plugin
                                    </artifactId>
                                    <versionRange>
                                        [0.0.5,)
                                    </versionRange>
                                    <goals>
                                        <goal>copy</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore></ignore>
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>


出于各种原因,我隐藏以上pom.xml的某些部分(虽然它不应该影响我的问题的诊断 - 只是把它放在那里,是的以上所有隐藏&#34;字段&#34;正确输入和引用。虽然如果您认为它可能会导致问题,请告知我,我会再次检查。

现在,<pluginManagement>...</pluginManagement>部分由Eclipse自动生成:

  

Eclipse说(screenshot):

     

生命周期配置未涵盖插件执行:com.googlecode.mavennatives:maven-nativedependencies-plugin:0.0.6:copy(execution:unpacknatives,phase:generate-resources)


通过点击:

我试图解决(似乎已经解决了)
  

Eclipse说(screenshot):

     

在Eclipse构建中忽略pom.xml中的目标副本永久标记


然后在pom.xml中生成以下代码(如上所示):

 <pluginManagement>
        <plugins>
            <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>
                                        com.googlecode.mavennatives
                                    </groupId>
                                    <artifactId>
                                        maven-nativedependencies-plugin
                                    </artifactId>
                                    <versionRange>
                                        [0.0.6,)
                                    </versionRange>
                                    <goals>
                                        <goal>copy</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore></ignore>
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>

问题#1:

所以,我在这里与此相关。我可以使用Project > Run As > Maven Build来构建我的项目(目标:干净的包),我可以使用lwjgl.jar的内容lwjgl_util.jar的内容获取可执行的JAR文件看起来像是一些本地文件(screenshot),这些文件被隐藏到JAR中,以创建一个独立的可执行文件。

运行它有一个漂亮的位置:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.path

好的,所以我知道java 不知道&#34; lwjgl&#34;在系统属性java.library.path中。由于LWJGL调用系统属性java.library.path以便找到本机库(正如我已阅读here),因此我认为我现在必须获得所需的本机库的路径。系统将此JAR文件运行到系统属性java.library.path

我能够通过Windows命令提示符使用以下命令让JVM正确运行我的JAR文件:
java -Djava.library.path=\exact\path\to\lwjgl-2.9.1\native\windows -jar \exact\path\to\<project-name>\target\<project-name>.jar

这很好。虽然,我 希望手动指定本机文件的位置。理想情况下,我正在寻找的是将原生文件嵌入到JAR中(它们是部分的,但我感觉它们并不是全部),在运行时基于用户选择&# 39;操作系统,并简单设置(建议/帮助如何这样做非常赞赏)。所以说,它们可以嵌入名为&#34; / natives / lwjgl /&#34;的文件夹中。在我的JAR里面。


问题#2:

这个问题与第一个问题相同,虽然它不是由编译的JAR引起的,而是在尝试通过我的IDE(Eclipse)运行我的主类时。

它会导致与上面相同的错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.path

现在,这里有不同之处。我知道这个特定问题的解决方案,它需要简单地完成这些快速步骤:

  
      
  • 项目&gt;构建路径&gt;配置构建路径...

  •   
  • 点击&#34;图书馆&#34;标签...

  •   
  • 找到并选择&#34; lwjgl.jar&#34;依赖性...

  •   
  • 打开它,然后选择&#34;原生图书馆位置:(无)&#34; ...

  •   
  • 点击&#34;编辑&#34; ...

  •   
  • 使用与您的操作系统对应的LWJGL的natives文件夹的正确URI填写字段(在我的情况下是&#39; s / natives / windows)

  •   
  • 完成!

  •   

虽然我的问题发生的地方是因为我使用maven作为我的依赖管理工具,但我的项目的构建路径(库)中的lwjgl.jar依赖项位于&#34; Maven Dependencies < / EM>&#34; (screenshot)。

这可以防止我设置URI。它根本没有设置(或者只是没有保存)。所以我的问题是,我做错了吗?或者我必须采取另一种方法,因为使用maven(m2e插件)?


非常感谢您阅读并帮助我解决我的任何一个问题!我把两个都放在这一个帖子中,因为第二个问题基本上是第一个但只是一个变种(sorta)所以我觉得制作两个帖子是没用的。我知道这可能是很多其他人的副本,但我无法找到符合我特定情况的帮助。如果您需要我遗漏的任何细节或信息,或者您认为我应该详细说明,请询问并且我非常愿意提供。


编辑#1:

通过添加VM参数解决问题#2&#34; -Djava.library.path = target / natives&#34;到项目的运行配置(screenshot)。

虽然我仍然遇到无法执行已编译JAR的问题(我希望能够普遍解决它,而不是专门为我的机器解决它,因为这最终将分发给Windows / Mac / Linux用户)。 / p>

编辑#2(2014年10月29日 - 美国东部时间下午6:30):

我已经能够创建批处理文件来运行该程序,虽然这显然取决于平台,而不是我想要的。任何有关获取系统属性的帮助都将非常感激。

1 个答案:

答案 0 :(得分:0)

正如您已经发现的那样,当您的IDE无法找到lwjgl的原生代码时,就会发生这种情况。

如果您没有这样做,我建议您遵循these步骤。这一切都取决于您的pom.xml和java.library.path的配置!

如果这不起作用,我可以尝试解决更多问题。但在我的情况下,它解决了这个问题。