0

我正在使用 netbeans 和 maven 开发小型 Web 应用程序。

项目由三个模块组成:

prychadmin(这是主要模块)

旅行

接口

它必须像这样划分,因为后面的两个模块也在其他地方使用。我将所有内容打包到一个 war 文件中(WEB-INF/lib 中包含的模块 travel 和接口)并尝试部署到 glassfish(尝试通过 netbeans 和手动部署),我在 travel 模块中包含的类之一上得到 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的

玻璃鱼 3.1.2.2

网豆 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

我注意到还有一个奇怪的地方,它可能对问题没有影响。在主要方向的文件夹,不仅有来自我的主模块的类,还有来自两个库中的第二个的两个类(实际上是接口)。

4

2 回答 2

0

尝试通过将您的应用程序相关的 jar 文件添加到两个域 ext (domain1/lib/ext) 目录中。

于 2012-10-25T10:46:03.227 回答
0

您不需要修改清单文件。从错误消息来看,缺少的类似乎是您的主模块中的类。你能确保该类存在于 WEB-INF/classes 中吗?

于 2012-10-25T10:53:06.083 回答