log4j 1 升級到 log4j 2
1肩杈、刪除掉 log4j 1的配置文件群发。如 classpath 下面的 log4j.xml 或者 log4j.properties撞反。
2逛尚、新增 log4j2.xml 文件在 classpath 下。以下是最基本的配置搓谆。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
</Console>
</Appenders>
<Loggers>
<!-- all 為所有的都輸出 -->
<Root level="all">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
我的生產(chǎn)配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
</Console>
<RollingFile name="RollingFileInfo" fileName="${sys:catalina.home}/logs/web/info.log"
filePattern="${sys:catalina.home}/logs/web/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<Filters>
<!--設置只輸出級別為INFO的日志-->
<ThresholdFilter level="INFO"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${sys:catalina.home}/logs/web/warn.log"
filePattern="${sys:catalina.home}/logs/web/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<Filters>
<!--設置只輸出級別為WARN的日志-->
<ThresholdFilter level="WARN"/>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${sys:catalina.home}/logs/web/error.log"
filePattern="${sys:catalina.home}/logs/web/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<Filters>
<!--設置只輸出級別為ERROR的日志-->
<ThresholdFilter level="ERROR"/>
</Filters>
<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<!--<logger name="org.springframework" level="INFO"/>-->
<!--<logger name="org.hibernate" level="INFO"/>-->
<Root level="info">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="RollingFileInfo"/>
<AppenderRef ref="RollingFileWarn"/>
<AppenderRef ref="RollingFileError"/>
</Root>
</Loggers>
</Configuration>
3炒辉、maven 配置
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.8.2</version>
</dependency>
去除xerces依賴
1、 移除對 xerces 的依賴包括 xerces泉手、xercesImpl黔寇、mlParserAPIs(重點)
2、 maven 移除以下配置(檢查 lib 中是否已經(jīng)移除掉了)
<dependency>
<groupId>org.apache</groupId>
<artifactId>xerces</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.10.0</version>
</dependency>
maven 工程斩萌,需要分析依賴(使用命令 mvn dependency:tree
)是否存在傳遞的依賴的xerces
阻止依賴傳送門
注意:如果依賴的 jar 文件中還存在以上的 jar 會出現(xiàn)一個錯誤是說注解無法注入缝裤。據(jù)說是 JDK 默認攜帶了此類的實現(xiàn)。
小插曲:出現(xiàn)下面的問題的時候颊郎,真心奔潰憋飞。這個提示明顯是說annotation轉換出現(xiàn)異常∧房裕看了2.5.13的源碼榛做。
org.apache.struts2.convention.annotation.Result.name()
這個是一個數(shù)組,而在2.3里面確實一個string
猾编,各種排查瘤睹。無果。重新build
了工程答倡,也就是去掉了xerces
這些依賴
java.lang.annotation.AnnotationTypeMismatchException: Incorrectly typed data found for annotation element public abstract java.lang.String[] org.apache.struts2.convention.annotation.Result.name() (Found data of type class java.lang.String[view])
Struts2 配置文件修改
struts2 的配置文件修改 dtd 頭部引用
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
web.xml修改
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
遺留問題
如果系統(tǒng)中使用 struts struts.convention.action.includeJars
來導入包的話(配置如下)轰传。會在tomcat6和7偶然出現(xiàn)在 classpath 找不到指定的 jar 文件。但是在最新版的 tomcat 8.5.23 是可以的瘪撇。但是最奇怪的是 build
多幾次就可以了 _
<constant name="struts.convention.action.includeJars" value=".*?/includeFile.*?jar(!/)?" />
后面要研究一下這個掃包的邏輯
更新20171126
經(jīng)過發(fā)現(xiàn) struts.convention.action.includeJars
的 jar
文件沒有META-INF
文件夾获茬。正確的jar 文件目錄是
*.jar
|--META-INF
|--com
|--youpackage
而在 lib 下面的卻沒有 META-INF
。
使用 命令mvn clean install
打包的時候看了輸出的目錄的 jar
所有東西都有倔既。然后在本地的 repositories
里面的 jar 也沒有問題恕曲。
后來發(fā)現(xiàn)原來是這個鍋是 IDEA
的。系統(tǒng)分為4個工程渤涌。依賴如下
d工程(web)
|--src
|--WebRoot
|--WEB-INF
|--lib
|--a工程.jar
|--b工程.jar
|--c工程.jar
|--classes
如果在 IDEA
中導入 d工程佩谣。然后再導入 其他三個工程。啟動 tomcat 的時候 IDEA 會自動編譯一下其他的三個工程实蓬。把其他三個工程的 jar
文件打包到 lib
下面茸俭。打包的時候就出現(xiàn)沒有 jar
文件 META-INF
這個目錄吊履。最奇怪的第二次啟動就可以了_。
備注
- 實驗過
jar
文件中必須有META-INF
這層目錄(里面可以沒有描述文件)调鬓。沒有的話跳過此包不掃描艇炎。(猜想:估計在 tomcat6、7 掃描的時候沒有此目錄的話可能會被認為是普通的壓縮文件腾窝。不需要裝載到系統(tǒng)中去缀踪。tomcat8是支持沒有META-INF
的) 。有興趣的可以去官網(wǎng)看卡 傳送門虹脯。另外發(fā)現(xiàn)IBM 一篇干貨 link
文章出自 http://lsof.fun