Maven: NoClassDefFoundError в главном потоке
В настоящее время я создаю небольшое серверное приложение 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-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
И это (часть) моего пом.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 ответа:
При запуске из Eclipse, Eclipse настраивает путь к классу для вас. Поэтому вы не столкнетесь с этой проблемой.
Когда вы работаете вне Eclipse, вам нужно настроить путь к классу, либо указав путь к этим файлам jar ie
file:/dev/libs/mina-core-2.0.3.jar
вMANIFEST.MF
, либо добавив опцию-cp
при выполнении приложения. Не забывайте, что записи в пути к классу в файле манифеста относятся либо к JAR, в который они встроены, либо к абсолютному пути к локальному файлу справочник.Другой вариант-упаковать его в один jar с помощью плагина сборки maven jar-with-dependencies.
Другой вариант-использовать Maven-dependency-plugin. Вы можете скопировать все зависимые библиотеки в папку, например lib, и использовать ее для classpath.
Для копирования зависимостей:
<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