NoClassDefFoundError。如何设置依赖项并部署java应用程序?

NoClassDefFoundError。如何设置依赖项并部署java应用程序?,java,deployment,jersey,glassfish-2.x,Java,Deployment,Jersey,Glassfish 2.x,我的Java应用程序需要org.objectweb.asm库。我在pom中指定了“asm”依赖项。将库与应用程序一起部署。但应用程序仍会抛出异常NoClassDefFoundError:org/objectweb/asm/ClassVisitor java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor at com.sun.jersey.api.core.PackagesResourceConfig.init(Pack

我的Java应用程序需要org.objectweb.asm库。我在pom中指定了“asm”依赖项。将库与应用程序一起部署。但应用程序仍会抛出异常NoClassDefFoundError:org/objectweb/asm/ClassVisitor

java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
    at com.sun.jersey.api.core.PackagesResourceConfig.init(PackagesResourceConfig.java:112)
    at com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:78)
... many more
java.lang.NoClassDefFoundError:org/objectweb/asm/ClassVisitor
位于com.sun.jersey.api.core.PackagesResourceConfig.init(PackagesResourceConfig.java:112)
位于com.sun.jersey.api.core.PackagesResourceConfig.(PackagesResourceConfig.java:78)
... 更多
我怎样才能解决这个问题

详细信息: 我使用的是Glassfish 2.1.1。该应用程序需要jersey 1.1.4,jersey需要asm 3.1。我假设glassfish 2.1.1需要1.1.4版本

如果我在服务器上运行Glassfish updatetool并安装Jersey,那么我的应用程序加载和运行时不会出现问题。我的客户端的服务器上没有安装Jersey,他们无法使用updatetool

Glassfish 2.1.1 updatetool在Glassfish/lib目录中安装jersey 1.1.4和asm-3.1.jar。 卸载jersey后,updatetool也会删除asm

如果我将jersey和asm作为依赖项并部署war文件,那么jersey和asm jar将进入本地位置,例如glassfish/domains/domain1/applications/j2ee modules/MYAPPNAME/WEB-INF/lib/asm-3.1.jar

Glassfish updatetool将asm放入lib文件夹:Glassfish/lib目录,应用程序开始部署并正常工作

以下是我的maven pom文件依赖项部分:

<dependencies>
    <dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.1</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-bundle</artifactId>
        <version>1.1.4</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey.jersey-test-framework</groupId>
        <artifactId>jersey-test-framework-grizzly2</artifactId>
        <version>1.17.1</version>
                    <scope>test</scope>
    </dependency>
    <dependency>  
                <groupId>javax.persistence</groupId>  
                <artifactId>persistence-api</artifactId>  
                <version>1.0</version>  
        <scope>provided</scope>
            </dependency>  
    <dependency>
        <groupId>org.jboss.spec</groupId>
        <artifactId>jboss-javaee-6.0</artifactId>
        <version>1.0.0.Final</version>
        <scope>provided</scope>
        <type>pom</type>
    </dependency>
            <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>        
</dependencies>

asm
asm
3.1
泽西岛
球衣束
1.1.4
com.sun.jersey.jersey-test-framework
jersey-test-framework-grizzly2
1.17.1
测试
javax.persistence
持久性api
1
假如
org.jboss.spec
jboss-javaee-6.0
1.0.0.1决赛
假如
聚甲醛
javax.servlet
servlet api
2.5
假如
log4j
log4j
1.2.17

在pom中尝试类似的操作:

  <dependency>
    <groupId>asm</groupId>
    <artifactId>asm</artifactId>
    <version>3.3.1</version>
  </dependency>

asm
asm
3.3.1

我与glassfish/lib文件夹中存储的旧jersey库发生冲突:

glassfish/lib/jersey-bundle-1.0.3.1.jar
已加载并使用它,而不是将JAR放在应用程序的本地文件夹中:

glassfish/domains/domain1/applications/j2ee-modules/MYAPPNAME/WEB-INF/lib/
“lib”文件夹中的Jersey jar正在同一个“lib”文件夹中查找“asm”库,因此从未找到我本地放置的asm-3.1.jar

我以为“本地”罐子是先装的。似乎搜索顺序不同真的是这样吗?如果我错了,请告诉我。

我通过验证哪个库与以下代码一起使用发现了问题:

logger.debug(PackagesResourceConfig.class.getResource("PackagesResourceConfig.class"));
注意:引发的异常中列出了PackageResourceConfig类


希望这个答案能帮助其他人节省时间。

检查:-部署的lib文件夹是否包含与target/app.war/WEB-INF/lib相同的jar。-maven中没有两个版本的asm.jar和一些冲突版本。(那是我的错误)检查。它们是一样的。由于某种原因,POM文件的一部分在最初的帖子中丢失了。这包括“asm”依赖性。我再次将POM标记为代码,并重新保存了帖子。