Java: Maven 项目中出现NoClassDefFoundError?

Java: NoClassDefFoundError in maven project?

我已经开始使用 Maven 在 Codenvy IDE 中使用 OpenGL 开发 3D java 游戏引擎。我已经配置为 运行 Java 8,并且我已经在 pom.xml 中设置了 LWJGL 所需的依赖项。但是,当我 运行 测试 window 时,我得到 NoClassDefFoundError。我不确定为什么会发生这种情况,考虑到 Maven 配置为将所有 .Jar 依赖项存储到一个文件中,因此访问它们应该不是问题。所有文件都已正确下载到我的 Codenvy 项目的 External Packages 目录中。

这里是 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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">
   <modelVersion>4.0.0</modelVersion>
   <groupId>engineTester.First3DEngine</groupId>
   <artifactId>First3DEngine</artifactId>
   <version>1.5.7</version>
   <packaging>jar</packaging>

  <dependencies>  
    <dependency>
      <groupId>org.lwjgl.lwjgl</groupId>
      <artifactId>lwjgl</artifactId>
      <version>2.8.4</version>
    </dependency>

    <dependency>
      <groupId>org.lwjgl.lwjgl</groupId>
      <artifactId>lwjgl_util</artifactId>
      <version>2.8.4</version>
    </dependency>

    <dependency>
      <groupId>org.lwjgl.lwjgl</groupId>
      <artifactId>lwjgl_util_applet</artifactId>
      <version>2.8.4</version>
    </dependency>

    <dependency>
      <groupId>com.typesafe.slick</groupId>
      <artifactId>slick_2.10</artifactId>
      <version>3.1.1</version>
    </dependency>
    <dependency>
      <groupId>java3d</groupId>
      <artifactId>vecmath</artifactId>
  <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <!-- Build an executable JAR -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <argLine>-Xmx1024m</argLine>
          <archive>
            <manifest>
          <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
        <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
              <mainClass>engineTester.MainGameLoop</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
   </build>
</project>

这就是我遇到的问题:

package engineTester;

import org.lwjgl.opengl.Display;

import renderEngine.DisplayManager;
import util.Console;

public class MainGameLoop {
    public static void main(String[] args){
        new Console();
        DisplayManager.createDisplay();  <-- line which throws the error
        while(!Display.isCloseRequested()){
            //game logic
            //render
            DisplayManager.updateDisplay();
        }

        DisplayManager.closeDisplay();

    }
}

DisplayManager.createDisplay()方法:

public static void createDisplay(){
    ContextAttribs attribs = new ContextAttribs(3,2);
    attribs.withForwardCompatible(true);
    attribs.withProfileCore(true);

    try{
        Display.setDisplayMode(new DisplayMode(WIDTH,HEIGHT));
        Display.create(new PixelFormat(), attribs);
    } catch (LWJGLException e){
        e.printStackTrace();
    }

    GL11.glViewport(0,0,WIDTH,HEIGHT);
}

最后是完整的错误:

Exception in thread "main" java.lang.NoClassDefFoundError:     org/lwjgl/LWJGLException
    at engineTester.MainGameLoop.main(MainGameLoop.java:11)
Caused by: java.lang.ClassNotFoundException: org.lwjgl.LWJGLException
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

感谢您的帮助!

您可以使用 maven-assembly-plugin 制作一个可以单独 运行 的胖 jar,或者您可以 运行 使用 maven 的程序,以便添加编译时 jar到你的类路径。

到 运行 使用 maven:

mvn exec:java -Dexec.mainClass="engineTester.MainGameLoop"

要使用程序集插件:

<build>
    <plugins>
         <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.5.5</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>engineTester.MainGameLoop</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <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>
    </plugins>
</build>

这将在目标目录中创建一个名称添加了 -jar-with-depencencies 的 jar。那可以只是 运行 和 java -jar jarfile.