2012-10-24 104 views
0

我正在使用NetBeans和Maven開發小型Web應用程序。部署戰爭後Glassfish上的NoClassDefFoundError

項目包括三個模塊:

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,但它沒有工作,所以它一定是我在戰爭文件中的愚蠢的錯誤。

有沒有人有任何想法?

這裏是我的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 

還有一個奇怪這個我有通知,還不如對問題沒有影響。在文件夾雜項主要方向不僅來自我的主要模塊的類,但也從兩個庫中的第二個庫的兩個類(實際接口)。

+0

請提供錯誤的詳細信息。你說的這三個模塊都是不同的應用程序或包? –

+0

我添加了確切的錯誤消息,我得到描述。這三個模塊是不同的包,只有prychadmin是應用程序,另外兩個是帶有類的簡單的jar。 – Edheene

回答

0

嘗試通過添加應用程序相關jar文件兩個域ext(domain1/lib/ext)目錄。

+0

剛剛嘗試過,沒有工作,也許我應該重新啓動一些東西?我查看了glassfish的web管理工具,但它沒有顯示這個應用程序的庫文件 – Edheene

+0

嘗試刪除您的GlassFish。從domain-> deploy和domain-> generated和domain-> eclipse應用程序和domain-> osgi緩存目錄中刪除所有內容。 –

0

你不需要修改你的清單文件。從錯誤消息中,似乎缺少的類是來自主模塊的類。你能確保這個類存在於WEB-INF /類中嗎?

+0

這個類是在lib目錄下的.jar包中,我對它進行了三重檢查。那麼,我可以將.cl​​ass文件複製到類文件夾中,但我沒有看到任何意見,我想找出爲什麼它不能正常工作,在lib中使用.jar,而不是使用可疑的解決方法。當然,如果一切都失敗了,我會使用這種解決方法,但我非常希望以正確的方式進行。 – Edheene

+0

如果你說它不能在tomcat上工作,顯然結構是不正確的。你可以在戰爭文件中設置目錄結構嗎?特別是關於未找到的類 – Wins

+0

我將其添加到問題描述 – Edheene