私は現在、小さな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
そしてこれは私の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>
私はここで何が間違っているのですか?
Eclipseから実行すると、Eclipseがクラスパスを構成します。したがって、この問題が発生することはありません。
Eclipseの外部で実行している場合は、これらのjarファイルへのパス(file:/dev/libs/mina-core-2.0.3.jar
にMANIFEST.MF
)を指定するか、実行時に-cp
オプションを追加して、CLASSPATHを設定する必要があります。アプリ。マニフェストファイルのクラスパスのエントリは、それらが埋め込まれているJARに相対パスであるか、ローカルファイルディレクトリへの絶対パスであることに注意してください。
もう1つのオプションは、Mavenアセンブリプラグインを使用して1つのjarとしてパッケージ化することです jar-with-dependencies 。
別のオプションは、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.htmlhttp://maven.Apache.org/plugins/maven-dependency- plugin/using.html