Maven:主线程中的NoClassDefFoundError

25

我正在构建一个小的Apache-Mina服务器应用程序,使用Maven进行构建。当我尝试运行jar文件时,出现以下错误:

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/mina/filter/codec/ProtocolCodecFactory 
Caused by: java.lang.ClassNotFoundException: org.apache.mina.filter.codec.Protoc  olCodecFactory
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: de.fr1zle.gpsserver.GpsServer. Program will exit.

在 Eclipse 中运行没有问题。

这是生成的 MANIFEST 文件的样子:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: fr1zle
Build-Jdk: 1.6.0_23
Main-Class: de.fr1zle.gpsserver.GpsServer
Class-Path: commons-lang-2.1.jar plexus-utils-1.1.jar junit-4.8.2.jar 
 log4j-1.2.14.jar slf4j-jdk14-1.5.11.jar slf4j-api-1.5.11.jar antlr-2.
 7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar hibernate-commons
 -annotations-3.2.0.Final.jar hibernate-jpa-2.0-api-1.0.0.Final.jar jt
 a-1.1.jar hibernate-annotations-3.5.6-Final.jar hibernate-core-3.5.6-
 Final.jar mysql-connector-java-5.1.15.jar mina-core-2.0.3.jar

以下是我的 pom.xml(部分内容):

<groupId>de.fr1zle.gpsserver</groupId>
    <artifactId>GPSServer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>GPSServer</name>
    <packaging>jar</packaging>
    <description>Tracks location of GPS modules and the information they submit.</description>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.3.1</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>de.fr1zle.gpsserver.GpsServer</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

我在这里做错了什么?

2个回答

23
另一个选项是使用maven-dependency-plugin。你可以将所有依赖库复制到一个名为lib的文件夹中,并将其用作类路径。
为了复制依赖项:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/lib
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

至于类路径,这里的classpathPrefix指定所有依赖项应该相对于归档文件位于“lib”文件夹中。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>com.citusdata.hadoop.HadoopTest</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

了解更多信息:

http://www.ibm.com/developerworks/java/library/j-5things13/index.html http://maven.apache.org/plugins/maven-dependency-plugin/usage.html


这是一个很棒的解决方案。在@metdos下对我有效。 - Amit Ben Ami
你还可以简单地将<classpathPrefix>lib/</classpathPrefix>替换为<classpathPrefix>dependency/</classpathPrefix>,而无需在maven-dependency-plugin中进行其他配置,但这确实使得代码更加明确和明显。谢谢你的精彩答案 :) - lolgab123

10
当你在Eclipse中运行时,Eclipse会为你配置类路径,因此你不会遇到这个问题。
当你在Eclipse之外运行时,你需要设置CLASSPATH,可以通过在MANIFEST.MF文件中提供这些jar文件的路径(例如file:/dev/libs/mina-core-2.0.3.jar),或者在执行应用程序时添加-cp选项来完成。请注意,manifest文件中类路径条目要么是相对于嵌入它们的JAR文件,要么是指向本地文件目录的绝对路径。
另一种选择是使用Maven Assembly插件jar-with-dependencies将其打包为一个jar文件。

1
非常感谢您!这解决了我的问题!我使用了带有依赖的jar文件。 - fr1zle
非常感谢,这可能节省了我数小时的搜索时间。 - Alp
@Alp - 很高兴能帮到你!祝你使用Maven愉快 :) - CoolBeans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接