在GlassFish 3上为Web应用程序禁用CDI
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在GlassFish 3上为Web应用程序禁用CDI相关的知识,希望对你有一定的参考价值。
我们有一个旧的Web应用程序(WAR),其中包含常见的内部库。最近,我们开始在另一个项目中使用CDI,该项目使用相同的内部库,并且一些内部库得到了META-INF/beans.xml
。
不幸的是,在GlassFish 3.1.2.2上部署期间,我们遇到了各种类加载错误。
[#|2014-03-14T14:11:20.302+0100|SEVERE|glassfish3.1.2|javax.enterprise.system.tools.admin.org.glassfish.deployment.admin|_ThreadID=40;_ThreadName=Thread-2;|Exception while loading the app :
com/example/SomethingState
java.lang.NoClassDefFoundError: com/example/SomethingState
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at org.glassfish.web.loader.WebappClassLoader.findClass(WebappClassLoader.java:927)
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1476)
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1359)
at java.lang.Class.getEnclosingMethod0(Native Method)
at java.lang.Class.getEnclosingMethodInfo(Class.java:959)
at java.lang.Class.getEnclosingClass(Class.java:1132)
at java.lang.Class.getSimpleBinaryName(Class.java:1277)
at java.lang.Class.isMemberClass(Class.java:1267)
at org.jboss.weld.util.reflection.Reflections.isNonStaticInnerClass(Reflections.java:139)
at org.jboss.weld.bootstrap.BeanDeployer.addClass(BeanDeployer.java:78)
at org.jboss.weld.bootstrap.BeanDeployer.addClasses(BeanDeployer.java:123)
at org.jboss.weld.bootstrap.BeanDeployment.createBeans(BeanDeployment.java:184)
at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:350)
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:179)
at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128)
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:277)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:460)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:353)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291)
at org.glassfish.deployment.autodeploy.AutoOperation.run(AutoOperation.java:145)
at org.glassfish.deployment.autodeploy.AutoDeployer.deploy(AutoDeployer.java:575)
at org.glassfish.deployment.autodeploy.AutoDeployer.deployAll(AutoDeployer.java:461)
at org.glassfish.deployment.autodeploy.AutoDeployer.run(AutoDeployer.java:389)
at org.glassfish.deployment.autodeploy.AutoDeployer.run(AutoDeployer.java:380)
at org.glassfish.deployment.autodeploy.AutoDeployService$1.run(AutoDeployService.java:220)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Caused by: java.lang.ClassNotFoundException: com.example.SomethingState
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1509)
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1359)
... 35 more
|#]
[#|2014-03-14T14:11:20.317+0100|WARNING|glassfish3.1.2|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=40;_ThreadName=Thread-2;|[AutoDeploy] Autodeploy failed : /opt/glassfish3/glassfish/domains/domain1/autodeploy/myapp.war.|#]
SomethingState
不在war
文件中(也不在随附的jar
文件中)。它是CDI尝试在扫描类路径期间加载的另一个类的超类,但webapp(也不是子类)不使用它,因此在CDI之前根本不是问题。如果我从随附的beans.xml
中删除了jar
,则webapp可以正常运行。我想避免更改war
以及在可能的情况下将缺少的jar
包括在内。
我们如何为该Web应用程序禁用CDI?
我尝试将WEB-INF/beans.xml
放入具有以下内容的war
:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" bean-discovery-mode="none">
<scan>
<exclude name="**" />
</scan>
</beans>
没有用,Web应用仍然无法部署。
另一个想法是从命令行使用以下属性进行部署,但它也没有用:
bin/asadmin deploy --property implicitCdiEnabled=false ~/myapp.war
这在xwiki上对我有用
bin / asadmin deploy --property hiddenCdiEnabled = false〜/ myapp.war
仍然感谢
这里是配置CDI扫描的指南https://blog.payara.fish/cdi-scanning-in-payara-server玻璃鱼也一样
以上是关于在GlassFish 3上为Web应用程序禁用CDI的主要内容,如果未能解决你的问题,请参考以下文章
在表单登录 Glassfish 上禁用重定向到上次访问的资源
使用较新版本的jna库在Glassfish上运行Web应用程序
IBM MobileFirst Platform 未在 iOS 上为混合应用程序触发远程禁用消息
在 Glassfish 3.0 安全领域中使用 bcrypt