环顾四周并阅读其他类似的帖子,我一直无法解决我作为依赖关系而对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):
我已经能够创建批处理文件来运行该程序,虽然这显然取决于平台,而不是我想要的。任何有关获取系统属性的帮助都将非常感激。
答案 0 :(得分:0)
正如您已经发现的那样,当您的IDE无法找到lwjgl的原生代码时,就会发生这种情况。
如果您没有这样做,我建议您遵循these步骤。这一切都取决于您的pom.xml和java.library.path的配置!
如果这不起作用,我可以尝试解决更多问题。但在我的情况下,它解决了这个问题。