NoClassDefFoundError。如何设置依赖项并部署java应用程序?
我的Java应用程序需要org.objectweb.asm库。我在pom中指定了“asm”依赖项。将库与应用程序一起部署。但应用程序仍会抛出异常NoClassDefFoundError:org/objectweb/asm/ClassVisitorNoClassDefFoundError。如何设置依赖项并部署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.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标记为代码,并重新保存了帖子。