I have a Maven GWT project. I included Hibernate and HSQLDB as persistence layer. Running the unit tests is fine, but when it try to run the server component, logging does not work and so I am blind to the errors on the server side. The errors I encouter are:
[ERROR] log4j:ERROR A "org.apache.log4j.RollingFileAppender" object is not assig nable to a "org.apache.log4j.Appender" variable. [ERROR] log4j:ERROR The class "org.apache.log4j.Appender" was loaded by [ERROR] log4j:ERROR [sun.misc.Launcher$AppClassLoader@baf1915] whereas object of type [ERROR] log4j:ERROR "org.apache.log4j.RollingFileAppender" was loaded by [WebApp ClassLoader=1312837549@4e404fad]. [ERROR] log4j:ERROR Could not instantiate appender named "file". [ERROR] log4j:ERROR A "org.apache.log4j.ConsoleAppender" object is not assignabl e to a "org.apache.log4j.Appender" variable. [ERROR] log4j:ERROR The class "org.apache.log4j.Appender" was loaded by [ERROR] log4j:ERROR [sun.misc.Launcher$AppClassLoader@baf1915] whereas object of type [ERROR] log4j:ERROR "org.apache.log4j.ConsoleAppender" was loaded by [WebAppClas sLoader=1312837549@4e404fad]. [ERROR] log4j:ERROR Could not instantiate appender named "stdout".
From googling I am pretty sure it is because two instances of the log4j.jar are present. Is there a good way or best practice way to solve this issue? I run the project in development mode from the console. My Pom.xml looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>testproject</groupId>
<artifactId>trustme-mdm-gwtp</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>GWTP Basic</name>
<description>Basic GWTP application</description>
<properties>
<!-- client -->
<gwt.version>2.6.0</gwt.version>
<gwtp.version>1.2.1</gwtp.version>
<gin.version>2.1.2</gin.version>
<!-- server -->
<guice.version>3.0</guice.version>
<!-- testing -->
<junit.version>4.7</junit.version>
<jukito.version>1.4</jukito.version>
<!-- maven -->
<gwt-maven-plugin.version>2.6.0</gwt-maven-plugin.version>
<maven-surefire-plugin.version>2.6</maven-surefire-plugin.version>
<maven-compiler-plugin.version>2.3.2</maven-compiler-plugin.version>
<maven-resources-plugin.version>2.5</maven-resources-plugin.version>
<maven-processor-plugin.version>2.0.5</maven-processor-plugin.version>
<maven-build-helper-plugin.version>1.7</maven-build-helper-plugin.version>
<target.jdk>1.7</target.jdk>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory>
</properties>
<build>
<outputDirectory>${webappDirectory}/WEB-INF/classes</outputDirectory>
<plugins>
<!-- JUnit Testing - skip *.GwtTest cases -->
<!-- 'mvn test' - runs the Jukito tests -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/*GwtTest.java</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<!-- GWT -->
<!-- 'mvn gwt:run' - runs development mode -->
<!-- 'mvn gwt:debug' - runs debug mode -->
<!-- 'mvn gwt:compile' - compiles gwt -->
<!-- 'mvn integration-test' - runs the gwt tests (*GwtTest.java) -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>${gwt.version}</version>
<configuration>
<!-- With multiple tests use GwtTestSuite.java for speed -->
<includes>**/*GwtTest.java</includes>
<extraJvmArgs>-Xss1024K -Xmx1024M -XX:MaxPermSize=256M</extraJvmArgs>
<copyWebapp>true</copyWebapp>
<hostedWebapp>${webappDirectory}</hostedWebapp>
<runTarget>Project.html</runTarget>
<modules>
<module>testproject.Project</module>
</modules>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<!-- Google Web Toolkit -->
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<version>${gwt.version}</version>
</dependency>
<!-- GWT-Platform -->
<dependency>
<groupId>com.gwtplatform</groupId>
<artifactId>gwtp-all</artifactId>
<version>${gwtp.version}</version>
</dependency>
<!-- DI -->
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>${guice.version}</version>
</dependency>
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-servlet</artifactId>
<version>${guice.version}</version>
</dependency>
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-assistedinject</artifactId>
<version>${guice.version}</version>
</dependency>
<dependency>
<groupId>com.google.gwt.inject</groupId>
<artifactId>gin</artifactId>
<version>${gin.version}</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jukito</groupId>
<artifactId>jukito</artifactId>
<version>${jukito.version}</version>
<scope>test</scope>
</dependency>
<!-- Hibernate -->
<!-- for JPA, use hibernate-entitymanager instead of hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.5.Final</version>
</dependency>
<!-- hSQLDB -->
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.3.2</version>
</dependency>
<!-- add slf4j interfaces to classpath -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
<!-- GWT-Log -->
<dependency>
<groupId>com.allen-sauer.gwt.log</groupId>
<artifactId>gwt-log</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
</project>
When I take a look at the \target...\lib folder, these are the jars that are deployed:
antlr-2.7.7.jar aopalliance-1.0.jar commons-collections-3.2.1.jar commons-lang-2.4.jar commons-logging-1.1.1.jar dom4j-1.6.1.jar gin-2.1.2.jar guava-16.0.1.jar guava-gwt-16.0.1.jar guice-3.0.jar guice-assistedinject-3.0.jar guice-servlet-3.0.jar gwt-jackson-0.4.0.jar gwt-log-3.3.0.jar gwtp-all-1.2.1.jar gwtp-clients-common-1.2.1.jar gwtp-crawler-1.2.1.jar gwtp-dispatch-common-client-1.2.1.jar gwtp-dispatch-common-shared-1.2.1.jar gwtp-dispatch-rest-1.2.1.jar gwtp-dispatch-rpc-client-1.2.1.jar gwtp-dispatch-rpc-server-1.2.1.jar gwtp-dispatch-rpc-server-guice-1.2.1.jar gwtp-dispatch-rpc-server-spring-1.2.1.jar gwtp-dispatch-rpc-shared-1.2.1.jar gwtp-mvp-client-1.2.1.jar gwtp-mvp-shared-1.2.1.jar gwtp-processors-1.2.1.jar gwtp-tester-1.2.1.jar gwt-user-2.6.1.jar hibernate-commons-annotations-4.0.4.Final.jar hibernate-core-4.3.5.Final.jar hibernate-entitymanager-4.3.5.Final.jar hibernate-jpa-2.1-api-1.0.0.Final.jar hsqldb-2.3.2.jar jackson-annotations-2.3.0.jar jackson-annotations-2.3.0-sources.jar jandex-1.1.0.Final.jar javassist-3.18.1-GA.jar javax.inject-1.jar jboss-logging-3.1.3.GA.jar jboss-logging-annotations-1.2.0.Beta1.jar jboss-transaction-api_1.2_spec-1.0.0.Final.jar json-20090211.jar jsr305-1.3.9.jar jsr311-api-1.1.1.jar maven-artifact-3.1.1.jar plexus-utils-3.0.15.jar servlet-api-2.5.jar spring-aop-3.2.3.RELEASE.jar spring-beans-3.2.3.RELEASE.jar spring-context-3.2.3.RELEASE.jar spring-core-3.2.3.RELEASE.jar spring-expression-3.2.3.RELEASE.jar spring-web-3.2.3.RELEASE.jar validation-api-1.0.0.GA.jar validation-api-1.0.0.GA-sources.jar velocity-1.7.jar xml-apis-1.0.b2.jar
I changed the pom.xml to this:
<!-- Google Web Toolkit -->
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-servlet</artifactId>
<version>${gwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<version>${gwt.version}</version>
<scope>provided</scope>
</dependency>
But still no success...
I inserted a screenshot of the dependency tree. My reputation does not allow to paste images. It is stored here:
You're probably facing the known issue of GWT 2.6.0 that incorrectly loads server-side classes in DevMode: https://code.google.com/p/google-web-toolkit/issues/detail?id=8585
Try using GWT 2.6.1 and see if that fixes the problem.
EDIT: Also, clean-up your dependencies' scopes: you have
gwt-user
andservlet-api
in yourWEB-INF/lib
, that mustn't be there; you also have a bunch of GWT-specific client-only JARs that shouldn't be there either.Thanks for the help (especially Thomas). The guide i used for my project stated log4j and slf4j would be necessary as external references in the pom.xml.
I simply removed it and it is working now. This has taught me however, that it really makes life simpler by not combining server and client dependencies.
change log4j dependency scope to provided in maven.check whether there are multiple logger jars.