Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4jLoggerFactory解决方法

今天在搭建一个项目单元测试环境跑测试用例的时候遇到了致命错误:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4jLoggerFactory
这个是什么情况?
翻看控制台输出信息看到一段:
SLF4J: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.

翻看了上面说的网站提示信息:
The purpose of slf4j-log4j12 module is to delegate or redirect calls made to an SLF4J logger to log4j. The purpose of the log4j-over-slf4j module is to redirect calls made to a log4j logger to SLF4J. If SLF4J is bound with slf4j-log4j12.jar and log4j-over-slf4j.jar is also present on the class path, a StackOverflowError will inevitably occur immediately after the first invocation of an SLF4J or a log4j logger.

意思是slf4j-log4j12是用来代理或者重定向调用使一个SLF4J的日志通过log4j输出,log4j-over-slf4j的目的是将log4j的日志重定向输出到SLF4J,如果它俩在一个class path下造成StackOverflow的错误,因为它俩会陷入一个死循环。如果不明白SLF4J和log4j的同学可以转到:http://www.importnew.com/7450.html 仔细阅读。

于是我寻找了项目的maven依赖,发现有3个依赖中出现了slf4j-log4j12.jar,在每个依赖里加上:

<exclusion>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
</exclusion>

最终解决了问题。

再次跑测试用例的时候,还有一堆报错也不见了:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/wangzhiang/.m2/repository/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/wangzhiang/.m2/repository/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

原因是:SLF4J会在编译时会绑定import org.slf4j.impl.StaticLoggerBinder; 该类里面实现对具体日志方案的绑定接入。任何一种基于SLF4J的实现都要有一个这个类。如:slf4j-log4j12-1.6.1提供对log4j的一种适配实现。我的项目中存在logback-classic-1.1.3和slf4j-log4j12-1.6.1两个实现SLF4J的包同时出现,就出现了上面的报错,加上依赖的exclusion去掉slf4j-log4j12即可。

-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.[ERROR] Maven execution terminated abnormally (exit code 1)解决方法

今天给同事的Mac配置JAVA项目IDEA开发环境的时候遇到了一个问题:
-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.[ERROR] Maven execution terminated abnormally (exit code 1)
Check了电脑的M2_HOME系统环境变量,都没有错误,于是在IDEA中File->Maven->Runner的VM options中增加配置:
-Dmaven.multiModuleProjectDirectory=$M2_HOME
保存解决问题。

IDEA出现[FATAL_ERROR] Cannot start Maven: Project JDK is not specified. 的解决办法

最近在给一个同事的Mac配置JAVA项目的开发环境的时候,启动项目IDEA报错:
[FATAL_ERROR] Cannot start Maven: Project JDK is not specified. <a href=’#’>Configure</a>
那么估计就是IDEA的JDK没有配置好,打开IDEA的preference,找到Maven->Runner,发现JRE项目的配置是“Use Project JDK (not defined yet)”,而那个Internal JRE的版本太低,所以我们需要配置Project JDK,配置的方法是点击顶部的File->Project Structure…->左边的“Project”->Project SDK
jdk
这时候现实的应该是“<No SDK>”,点开看看有没有其他选项,如果没有就点击New…->JDK,选择你的JDK目录到“Contents/Home”下。如果有,就选择配置好的例如:“1.7”。
以上操作之后,问题就解决了。

IDEA集成开发工具Debug Cannot start Maven问题解决方法

最近接手了一个新的JAVA项目,在IDEA中配置好了Debug了,点击Debug,在控制台报错如下:

[FATAL_ERROR] Cannot start Maven: No valid Maven installation found. Either set the home directory in the <a href="#">configuration dialog</a> or set the M2_HOME environment variable on your system.

我以前的项目都可以正常使用Maven,这个项目居然不能使用了,我的~/.zshrc一切配置都正常,真是奇怪了。后来去stackoverflow上查了下,原来是Mac的Shell环境变量未必能够被GUI应用读到。解决方法如下:

sudo vim /etc/launchd.conf  //一般Mac上默认是没有这个文件的

在这个文件中加上你的M2_HOME的配置:

setenv M2_HOME /usr/local/maven/apache-maven-3.2.1

然后你一定要重新启动Mac这个配置才会生效,重启之后Debug就正常了。