【JAVA调错】----JBoss发布多个项目时抛出webAppRootKey错误

简介: <div class="markdown_views"><p></p><div class="toc"><div class="toc"><ul><li><a href="#%E9%94%99%E8%AF%AF%E7%94%B1%E6%9D%A5">错误由来</a></li><li><a href="#%E9%94%99%E8%AF%AF%E5%8E%9F%E5%9

错误由来


    说一说事情的缘由,最近项目中加了日志,在项目中加了spring监听器:

<context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/config/log4j.xml</param-value>
    </context-param>
    <!--启动一个watchdog线程每1800秒扫描一下log4j配置文件的变化 -->
    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <param-value>1800000</param-value>
    </context-param>
    <!--spring log4j监听器 -->
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

log4jRefreshInterval 为刷新间隔,单位毫秒

log4jConfigLocationlog4j配置文件路径,也可使用classpath:xxx的形式

    进行如上配置后,修改log4j.xml后,在刷新间隔时间后,配置的监听器Log4jConfigListener会重新加载log4j相关配置。

    然后再JBoss中启动项目,如果说启动单个项目的话,是没有问题出现的,但是同时启动两个或者以上的时候,就报出如下的ERROR

20:54:07,883 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/itoo-exam-scoreanalyze-web]] (ServerService Thread Pool -- 55) JBWEB000287: Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener: java.lang.IllegalStateException: Web app root system property already set to different value: 'webapp.root' = [F:\Program Files\jboss-eap-6.2-itoo4.0\standalone\deployments\itoo-exam-calculatescore-ear.ear\itoo-exam-calculatescore-web.war\] instead of [F:\Program Files\jboss-eap-6.2-itoo4.0\standalone\deployments\itoo-exam-scoreanalyze-ear.ear\itoo-exam-scoreanalyze-web.war\] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!
    at org.springframework.web.util.WebUtils.setWebAppRootSystemProperty(WebUtils.java:150) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
    at org.springframework.web.util.Log4jWebConfigurer.initLogging(Log4jWebConfigurer.java:117) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
    at org.springframework.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:46) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
    at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3339) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3777) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.jboss.as.web.deployment.WebDeploymentService.doStart(WebDeploymentService.java:156) [jboss-as-web-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
    at org.jboss.as.web.deployment.WebDeploymentService.access$000(WebDeploymentService.java:60) [jboss-as-web-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
    at org.jboss.as.web.deployment.WebDeploymentService$1.run(WebDeploymentService.java:93) [jboss-as-web-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [rt.jar:1.8.0_60]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_60]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_60]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_60]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_60]
    at org.jboss.threads.JBossThread.run(JBossThread.java:122)

错误原因


    在上面的异常中明显的提示:

Web app root system property already set to different value: 'webapp.root' = [F:\Program Files\jboss-eap-6.2-itoo4.0\standalone\deployments\itoo-exam-calculatescore-ear.ear\itoo-exam-calculatescore-web.war\] instead of [F:\Program Files\jboss-eap-6.2-itoo4.0\standalone\deployments\itoo-exam-scoreanalyze-ear.ear\itoo-exam-scoreanalyze-web.war\] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!

    在网上查了查,发生的原因是:当两个web项目在同一容器中定义了相同的webAppRootKey或者都没有定义!也就是说:keywebapp.root已经指向项目itoo-exam-calculatescore-web,不能在指向itoo-exam-scoreanalyze-web;Web应用服务器JBoss/Tomcat不会为其下不同的web应用使用独立的系统参数;即就是说,应用服务器JBoss/Tomcat上所有的web应用共用一个系统参数对象(webAppRootKey,默认值为“webapp.root”)。运行多个web应用时,你就必须通过 webAppRootKey 上下文参数的不同为不同的web应用指定不同的属性名,如此,才不会造成多个web应用指向同一个webAppRootKey

webAppRootKeyweb工程的根目录在系统环境变量中的key

错误解决方案


    有两种解决方案:

第一种

    修改web.xml文档,指定工程自己的webAppRootKey

<!-- 项目app1的web.xml配置 --> 
<context-param>  
    <param-name>webAppRootKey</param-name>  
    <param-value>app1.root</param-value>  <!-- 更改"webapp.root"为自定义的任意字符串 -->
</context-param>  

------------------- 华丽的分割线 --------------------

<!-- 项目app2的web.xml配置 -->  
<context-param>  
    <param-name>webAppRootKey</param-name>  
    <param-value>app2.root</param-value>  <!-- 更改"webapp.root"为自定义的任意字符串 -->
</context-param>  

第二种

     修改web.xml文档

    <context-param>
        <param-name>log4jExposeWebAppRoot</param-name>
        <param-value>false</param-value>
    </context-param>

log4jExposeWebAppRoot 为是否设置环境变量,可选 true/false

Web应用根系统属性是否被暴露,使得可以获得日志文件相对于web应用的根目录路径。默认值是”true”,可以设置为”false”来禁止暴露web应用的根系统属性。

【转载请注明出处:令仔很忙(【JAVA调错】—-JBoss发布多个项目时抛出webAppRootKey错误)】

相关文章
|
17小时前
|
存储 Java Maven
Maven 构建 Java 项目
使用 Maven 的 `maven-archetype-quickstart` 插件在 `C:\MVN` 创建 Java 应用项目 `consumerBanking`,命令行参数包括 `-DgroupId`, `-DartifactId` 和 `-DarchetypeArtifactId`。项目包含 src/main/java 和 src/test/java 目录,分别存放 Java 代码和测试代码,以及 src/main/resources 用于存储资源文件。默认生成的 `App.java` 和 `AppTest.java` 分别为应用主类和测试类。
|
3天前
|
移动开发 前端开发 Java
STS里的java 工程项目名称修改和目录设置成源代码
STS里的java 工程项目名称修改和目录设置成源代码
|
3天前
|
JavaScript 前端开发 Java
java项目的打包将vue放到.jar里面部署
java项目的打包将vue放到.jar里面部署
|
6天前
|
缓存 安全 前端开发
来聊聊Java项目分层规范
本文讨论了Java项目的分层规范,强调了分层的重要性以避免代码不易扩展和职责边界模糊。作者分享了阿里提出的六层分层模型(开放接口层、终端显示层、Web层、Service层、Manager层、Mapper层)以及对应的领域模型(DO、DTO、VO、query)。同时,提出了简化版的分层规约,以提高开发效率。作者是CSDN Java博客专家,维护者之一的Java Guide项目,并提供了个人项目结构示例。文章鼓励读者关注其公众号以获取更多交流机会。
22 4
|
7天前
|
Java
springboot项目出现Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/Filter
springboot项目出现Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/Filter
13 0
|
11天前
|
Java Maven
Maven 构建 Java 项目
使用Maven的`maven-archetype-quickstart`插件在C:\MVN下创建Java应用,命令包括`groupId`, `artifactId`, 和 `archetypeArtifactId`参数。生成的项目包含src/main/java和src/test/java目录,分别用于存放源代码和测试代码,还有src/main/resources用于资源文件。默认提供App.java主类和AppTest.java测试类。按照预设结构组织文件,Maven将自动管理构建过程。
|
14天前
|
Java
IDEA云行项目提示Error: java: OutOfMemoryError
IDEA云行项目提示Error: java: OutOfMemoryError
|
14天前
|
Java API 数据安全/隐私保护
【亮剑】如何在Java项目中结合Spring框架实现邮件发送功能
【4月更文挑战第30天】本文介绍了如何在Java项目中结合Spring框架实现邮件发送功能。首先,需在`pom.xml`添加Spring和JavaMail依赖。然后,在`applicationContext.xml`配置邮件发送器,包括SMTP服务器信息。接着,创建一个使用依赖注入的`EmailService`类,通过`JavaMailSender`发送邮件。最后,调用`EmailService`的`sendSimpleEmail`方法即可发送邮件。最佳实践包括:使用配置管理敏感信息,利用`MimeMessage`构造复杂邮件,异常处理和日志记录,以及在大量发送时考虑使用邮件队列。
|
19天前
|
Java 应用服务中间件 Docker
【Docker】部署启动java项目
【Docker】部署启动java项目
21 2
|
19天前
|
搜索推荐 前端开发 Java
java医院绩效考核管理系统项目源码
系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
18 0