我正在使用netbeans和maven开发小型Web应用程序。
项目包括三个模块:
prychadmin(这是主要模块)
行驶
接口
它必须像这样划分,因为后面的两个模块也在其他地方使用。我将所有内容打包成war文件(模块旅行和WEB-INF / lib中包含的接口)并尝试部署到glassfish(尝试通过netbeans部署并手动部署)并且我在旅行模块中包含的一个类上获得NoClassDefFoundError。
RuntimeException
java.lang.NoClassDefFoundError: chore/gry/prych/map/LocationImpl
我正在寻找解决方案的几天时间,一位消息人士告诉我修改MANIFEST.MF所以它现在看起来像这样:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: user
Build-Jdk: 1.6.0_26
Class-Path: travel-1.0-SNAPSHOT.jar log4j-1.2.16.jar interfaces-1.0-SN
APSHOT.jar
但它没有帮助。
我也尝试将它部署到tomcat,但它也没有用,所以它一定是我在war文件中的愚蠢错误。
有没有人有任何想法?
这是我的prychadimn项目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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>prych</artifactId>
<groupId>chore.gry</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>chore.gry.prych</groupId>
<artifactId>prychadmin</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>prychadmin Java EE 6 Webapp</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>java.net2</id>
<name>Repository hosting the jee6 artifacts</name>
<url>http://download.java.net/maven/2</url>
</repository>
<repository>
<id>apache</id>
<name>Apache</name>
<url>http://ftp.cica.es/mirrors/maven2/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>chore.gry.prych</groupId>
<artifactId>travel</artifactId>
<version>1.0-SNAPSHOT</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1-alpha-2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>compile</phase>
<configuration>
<tasks>
<copy todir="src\main\webapp\chore\gry\prych\prychadmin\mapa">
<fileset dir="target\classes\chore\gry\prych\prychadmin\mapa"/>
</copy>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<finalName>prychadmin</finalName>
</build>
<profiles>
<profile>
<id>endorsed</id>
<activation>
<property>
<name>sun.boot.class.path</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<!-- javaee6 contains upgrades of APIs contained within the JDK itself.
As such these need to be placed on the bootclasspath, rather than classpath of the
compiler.
If you don't make use of these new updated API, you can delete the profile.
On non-SUN jdk, you will need to create a similar profile for your jdk, with the similar property as sun.boot.class.path in Sun's JDK.-->
<compilerArguments>
<bootclasspath>${settings.localRepository}/javax/javaee-endorsed-api/6.0/javaee-endorsed-api-6.0.jar${path.separator}${sun.boot.class.path}</bootclasspath>
</compilerArguments>
</configuration>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>6.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
我的环境:
Windows 7
Glassfish 3.1.2.2
Netbeans 7.2
JDK 1.6.0_26
Maven 3.0.3
EDIT1 这是我的包树:
- index.jsp
-
+---chore
- L---gry
- L---prych
- L---prychadmin
- L---mapa
- DBConnector.class
- Location.class
- ....
- PathsEditorPanel.class
-
+---css
- prych.css
-
+---lib
- travel-1.0-SNAPSHOT.jar
-
+---META-INF
- - context.xml
- - MANIFEST.MF
- -
- +---maven
- - L---chore.gry.prych
- - L---prychadmin
- - pom.properties
- - pom.xml
- -
- L---services
- java.sql.Driver
-
+---org
- L---postgresql
- - Driver$1.class
- - Driver$ConnectThread.class
- - ...
- RecoveredXid.class
-
L---WEB-INF
+---classes
- L---chore
- L---gry
- L---prych
- L---prychadmin
- - Starter.class
- -
- L---mapa
- DBConnector.class
- LocationAdmin.class
- ...
- PathsEditorPanel.class
-
L---lib
interfaces-1.0-SNAPSHOT.jar
log4j-1.2.16.jar
travel-1.0-SNAPSHOT.jar <-- this is the one that has LocationImpl.class
我也注意到了一个奇怪的问题,它可能对问题没有任何影响。在主方向的 chore 文件夹中,不仅是来自我的主模块的类,还有来自两个库中第二个的两个类(实际上是接口)。
答案 0 :(得分:0)
尝试将依赖于应用程序的jar文件添加到两个域ext(domain1 / lib / ext)目录。
答案 1 :(得分:0)
您不需要修改清单文件。从错误消息中,似乎缺少的类是主模块中的类。你能确保这个类存在于WEB-INF / classes中吗?