我的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
如何解决问题
详细信息:我使用的是Glassfish 2.1.1。该应用程序需要球衣1.1.4,球衣需要asm 3.1。我认为玻璃鱼2.1.1 需要1.1.4版本
如果我运行Glassfish更新工具并在服务器上安装Jersey,那么我的应用程序加载并运行时不会出现问题。我的客户端的服务器上没有安装Jersey,他们不能使用更新工具。
Glassfish 2.1.1更新工具在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更新工具将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>
我与存储在glassfish/lib文件夹中的旧jersey库发生冲突:
glassfish/lib/jersey-bundle-1.0.3.1.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"));
注意抛出的异常中列出的PackagesSourceConfig类。
希望这个答案能帮助其他人节省时间。
在你的pom:中尝试这样的东西
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>