我正在使用 maven 编译和打包我的程序,它编译和打包时没有任何错误,当我从命令行运行我的 jar 时,UI 加载良好,但是当我按下播放按钮时,我收到错误: “Thread-0”java.lang.NoClassDefFoundError:org/lwjgl/glfw/GLFW 在 gameGraphics.GraphicsDisplay.init(GraphicsDisplay.java:54).
我使用 Eclipse 作为 IDE,并有一个 Maven 项目。 UI 使用 Swing 进行编码。 UI.png 我创建了一个名为 GraphicsDisplay 的类,它使用 LWJGL 创建我的 GLFW 窗口: GLFW 窗口(GrapicksDisplay 类) 当我按下 UI 中的播放按钮时,会调用 Graphics 显示类,并在单独的线程上运行。
所以当我在 Eclipse 中运行我的程序时,一切都正常......很好 当我使用 Eclipse 导出导出程序并将源文件夹与可运行文件放在一起时,一切正常。 当我执行 Maven clean、编译和打包时,UI 工作正常,但是当我按下播放按钮时,出现上述错误: “Thread-0”java.lang.NoClassDefFoundError:org/lwjgl/glfw/GLFW 在 gameGraphics.GraphicsDisplay.init(GraphicsDisplay.java:54).
这是我的 pom.xml:
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"> 4.0.0
<groupId>nhvdr</groupId>
<artifactId>javaSwingBuild_2D</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>javaSwingBuild_2D</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>12</maven.compiler.source>
<maven.compiler.target>12</maven.compiler.target>
<lwjgl.version>3.3.4</lwjgl.version>
<joml.version>1.10.7</joml.version>
<lwjgl3-awt.version>0.1.8</lwjgl3-awt.version>
<steamworks4j.version>1.9.0</steamworks4j.version>
<steamworks4j-server.version>1.9.0</steamworks4j-server.version>
<joml-primitives.version>1.10.0</joml-primitives.version>
<lwjgl.natives>natives-windows</lwjgl.natives>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-bom</artifactId>
<version>${lwjgl.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl</artifactId>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-glfw</artifactId>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-opengl</artifactId>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-opengles</artifactId>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-stb</artifactId>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl</artifactId>
<classifier>${lwjgl.natives}</classifier>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-glfw</artifactId>
<classifier>${lwjgl.natives}</classifier>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-opengl</artifactId>
<classifier>${lwjgl.natives}</classifier>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-opengles</artifactId>
<classifier>${lwjgl.natives}</classifier>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-stb</artifactId>
<classifier>${lwjgl.natives}</classifier>
</dependency>
<dependency>
<groupId>org.joml</groupId>
<artifactId>joml</artifactId>
<version>${joml.version}</version>
</dependency>
<dependency>
<groupId>org.lwjglx</groupId>
<artifactId>lwjgl3-awt</artifactId>
<version>${lwjgl3-awt.version}</version>
</dependency>
<dependency>
<groupId>com.code-disaster.steamworks4j</groupId>
<artifactId>steamworks4j</artifactId>
<version>${steamworks4j.version}</version>
</dependency>
<dependency>
<groupId>com.code-disaster.steamworks4j</groupId>
<artifactId>steamworks4j-server</artifactId>
<version>${steamworks4j-server.version}</version>
</dependency>
<dependency>
<groupId>org.joml</groupId>
<artifactId>joml-primitives</artifactId>
<version>${joml-primitives.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>nhvdr.javaSwingBuild.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
我可能会错过什么?
您的
pom.xml
文件基本正确。它只是未能构建一个“胖罐子”。当使用 7zip 打开 Maven 时,您可以看到 Maven 正在生成一个瘦小的 jar,因为存档中不包含 LWJGL 文件。
用这两个替换你的插件来构建一个胖罐子:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>nhvdr.javaSwingBuild.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
构建时,将创建两个 jar。标有
[your_jar_name]-jar-with-dependencies.jar
的就是胖罐子。该解决方案基于
这个关于使用 Maven 构建 fat jar 的 StackOverflow 线程。请注意,生成的 fat jar 只能在 Windows 计算机上运行,因为您仅在
LWJGLcustomize 站点上选择了 windows-x64 的本机。如果您希望您的 fat jar 在每台计算机上运行,请在 LWJGL 自定义网站 上,您必须: 在“模式”类别下选择“Maven”
pom.xml
plugins