Glassfishv3.0.1でIntelliJ Java 9.0.3を使用してMavenでデプロイされたIDEA EE 6Wicketアプリケーションがあります。ロギングにはslf4j-log4j12-1.5.6とslf4j-api-1.5.8およびlog4j-1.2.16を使用します。
以前は、netbeansまたはEclipseを介してデプロイした場合は正常に機能していましたが、IntelliJ IDEAを使用してデプロイすると、log4j.propertiesファイルが無視され、glassfishのログがログメッセージを処理します。 IDEAはそれとは何の関係もないと思います。何か他のものが変わったに違いありません。私には何がわからないのです。
Log4j.propertiesファイルがWEB-INF/classesディレクトリにあり、slf4j/log4jjarが戦争のWEB-INF/libディレクトリにあることを確認しました。これを機能させるために欠落しているある種の構成はありますか?
ありがとう。
編集:より多くの情報で更新され、pomの依存関係が投稿されました。
これが私のpom.xmlの関連セクションです:
<!-- Guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>r05</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.0</version>
<scope>test</scope>
</dependency>
<!-- Java EE 6 -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>bean-validator</artifactId>
<version>3.0-JBoss-4.0.0.Beta3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
<!-- Wicket -->
<dependency>
<groupId>org.Apache.wicket</groupId>
<artifactId>wicket</artifactId>
<version>1.4.9</version>
</dependency>
<dependency>
<groupId>org.Apache.wicket</groupId>
<artifactId>wicket-auth-roles</artifactId>
<version>1.4.9</version>
</dependency>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-wicket</artifactId>
<version>1.0.1-Final</version>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.5.1-Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.1-Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>3.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.5.1-Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>3.5.1-Final</version>
</dependency>
<!-- Database -->
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>8.4-701.jdbc4</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
更新:問題を再現しようとしました。簡単なWicketプロジェクト(あなたと同じバージョン)を作成しました:
mvn archetype:create \
-DarchetypeGroupId=org.Apache.wicket \
-DarchetypeArtifactId=wicket-archetype-quickstart \
-DarchetypeVersion=1.4.9 \
-DgroupId=com.mycompany \
-DartifactId=my-wicketapp
これには、標準出力にログを記録する単純なlog4j.propertiesがあります。
log4j.appender.Stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.Stdout.layout=org.Apache.log4j.PatternLayout
log4j.appender.Stdout.layout.conversionPattern=%-5p - %-26.26c{1} - %m\n
log4j.rootLogger=INFO,Stdout
log4j.logger.org.Apache.wicket=INFO
log4j.logger.org.Apache.wicket.protocol.http.HttpSessionStore=INFO
log4j.logger.org.Apache.wicket.version=INFO
log4j.logger.org.Apache.wicket.RequestCycle=INFO
次に:
repositories
とpluginRepositories
を追加しましたjavax.servlet
依存関係を追加しましたembedded-glassfish
プラグインを追加しましたdependencyManagement
要素でslf4j-api
を宣言しました。完全なpom.xmlは次のようになります(誰でも複製できるように):
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>my-wicketapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<!-- TODO project name -->
<name>quickstart</name>
<description/>
<!--
TODO <organization> <name>company name</name> <url>company url</url>
</organization>
-->
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.Apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<repositories>
<!-- For Hibernate Artifacts -->
<repository>
<id>repository.jboss.org-public</id>
<name>JBoss repository</name>
<url>https://repository.jboss.org/nexus/content/groups/public</url>
</repository>
<!-- repository for Java EE 6 Binaries -->
<repository>
<id>Java.net2</id>
<name>Repository hosting the jee6 artifacts</name>
<url>http://download.Java.net/maven/2</url>
</repository>
</repositories>
<pluginRepositories>
<!-- GlassFish repository for the embedded-glassfish plugin -->
<pluginRepository>
<id>glassfish</id>
<name>GlassFish Maven 2 Repository</name>
<url>http://download.Java.net/maven/glassfish</url>
</pluginRepository>
</pluginRepositories>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.5.5-Final</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>r05</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.servlet</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>bean-validator</artifactId>
<version>3.0-JBoss-4.0.0.Beta3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
<!-- WICKET DEPENDENCIES -->
<dependency>
<groupId>org.Apache.wicket</groupId>
<artifactId>wicket</artifactId>
<version>${wicket.version}</version>
</dependency>
<dependency>
<groupId>org.Apache.wicket</groupId>
<artifactId>wicket-auth-roles</artifactId>
<version>${wicket.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-wicket</artifactId>
<version>1.0.1-Final</version>
</dependency>
<!--
OPTIONAL <dependency> <groupId>org.Apache.wicket</groupId>
<artifactId>wicket-extensions</artifactId>
<version>${wicket.version}</version> </dependency>
-->
<!-- LOGGING DEPENDENCIES - LOG4J -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<!-- JUNIT DEPENDENCY FOR TESTING -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<!-- GLASSFISH EMBEDDED FOR TESTING -->
<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.0.1</version>
<scope>test</scope>
</dependency>
<!-- JETTY DEPENDENCIES FOR TESTING -->
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>${jetty.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>${jetty.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-management</artifactId>
<version>${jetty.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<filtering>false</filtering>
<directory>src/main/resources</directory>
</resource>
<resource>
<filtering>false</filtering>
<directory>src/main/Java</directory>
<includes>
<include>**</include>
</includes>
<excludes>
<exclude>**/*.Java</exclude>
</excludes>
</resource>
</resources>
<testResources>
<testResource>
<filtering>false</filtering>
<directory>src/test/Java</directory>
<includes>
<include>**</include>
</includes>
<excludes>
<exclude>**/*.Java</exclude>
</excludes>
</testResource>
</testResources>
<plugins>
<plugin>
<inherited>true</inherited>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<optimize>true</optimize>
<debug>true</debug>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Eclipse-plugin</artifactId>
<configuration>
<downloadSources>true</downloadSources>
</configuration>
</plugin>
<plugin>
<groupId>org.glassfish</groupId>
<artifactId>maven-embedded-glassfish-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<serverID>server</serverID>
<name>server</name>
<app>${project.build.directory}/${project.build.finalName}.war</app>
<port>8080</port>
<instanceRoot>${project.build.directory}/gfe-${maven.build.timestamp}</instanceRoot>
<!--contextRoot>${build.finalName}</contextRoot-->
<autoDelete>true</autoDelete>
<!--configFile>${basedir}/domain.xml</configFile-->
</configuration>
</plugin>
</plugins>
</build>
<properties>
<wicket.version>1.4.9</wicket.version>
<jetty.version>6.1.4</jetty.version>
<slf4j.version>1.5.6</slf4j.version>
</properties>
</project>
そして、embedded-glassfishプラグインを使用してプロジェクトを実行すると、次のようになります。
$ mvn package ... $ mvn Embedded-glassfish:run ...
ブラウザで http:// localhost:8080/server にアクセスすると、期待どおりに標準出力でログが取得されます。
... 情報:[WicketApplication]開発モードでWicketバージョン1.4.9を開始しました ****************** ************************************************** ***警告:Wicketは開発モードで実行されています。 *** *** ^^^^^^^^^^^ *** ***これを変更せずにライブサーバーにデプロイしないでください。 *** ***詳細については、Application#getConfigurationType()を参照してください。 *** ****************************************** **************************
これは代表的なものなのかしら。
私は戦争をチェックしました、log4j.propertiesは確かにWEB-INF/classesにあります。私はlog4j.jarを持っていません、私はslf4j-log4j12.jarを持っています。
slf4j-log4j12.jarはlog4j.jarの代わりではありません、slf4j-log4j12.jarはlog4Jバージョン1.2のbindingです、まだlog4jが必要です。瓶。 SLF4Jドキュメントから:
展開時にロギングフレームワークとバインドする
前述のように、SLF4Jはさまざまなロギングフレームワークをサポートしています。 SLF4Jディストリビューションには、「SLF4Jバインディング」と呼ばれるいくつかのjarファイルが付属しており、各バインディングはサポートされているフレームワークに対応しています。
slf4j-log4j12-1.6.1.jar:広く使用されているロギングフレームワークであるlog4jバージョン1.2のバインディング。また、クラスパスにlog4j.jarを配置する必要があります。
NetBeansとEclipseでこれをどのように機能させたのだろうか。
私はまったく同じ問題を抱えていました。
Log4jだけでもうまく機能します。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
しかし、その上でSlf4jを使用しようとすると、Mavenがクラスパス上のisのディレクトリにファイルを追加しても、「src/resources /log4j.properties」ファイルが見つかりません。
したがって、これはそのままでは機能しません。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.4</version>
</dependency>
これを機能させるには、「log4j.properties」をクラスパスに明示的に追加するか、サーバーにその場所を指示する必要があります。これを実現する方法は次のとおりです(この例はWindows上にあります)。
-Dlog4j.configuration=file:C:\[pathToYourProject]\trunk\target\classes\log4j.properties
Eclipseでは(これを使用する場合)、実行構成/ VM引数に同じ行を追加できます。
私も同じ問題を抱えていました。解決策は簡単です。すべてのロギング依存関係は、クラスパス上のGlassfishの前にある必要があります。
古いMaven2バージョンには、クラスパスの一貫性にいくつかの問題があることに注意してください。この問題が修正された2.2.1を使用しています(2.0.9で修正されたと思います)。
log4jマニュアル をご覧ください。 「デフォルトの初期化手順」のセクションでは、log4jが初期化ファイルを検索する方法について説明します。たぶん、あなたは物事を機能させるためにこのオプションのいくつかを試すことができます。
すべてのslf4j依存関係を削除し、Log4j APIを直接使用するようにログコードを変更することをお勧めします(これがそれほど手間がかからない場合は、プロジェクトのサイズがわかりません)。これが機能したら、slf4jが提供する柔軟性が本当に必要かどうかを検討してください。その場合は、正しいバージョンのslf4j(slf4j-log4j12はlog4j 1.2.16に使用する正しいバージョンではない可能性があります)を選択して、統合し直してください。
最近slf4jに遭遇しましたが、同様の構成の問題が発生したため、最終的にはslf4jを完全に削除しました。
次のロギング依存関係があります:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>0.9.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
<scope>runtime</scope>
</dependency>
/ src/main/resources /の下に、さまざまな側面(appenders、..)を定義するlogback.xmlがあります。これはMavenによって取得され、WEB-INF/classesにコピーされます。
それが役に立ったことを願っています
AdriaanKosterの答えを支持します。ただし、純粋なlog4jが機能しない場合は、次のことを試してください。このような単純なクラスを作成します
import org.Apache.log4j.Logger;
public class LogTest {
private static Logger log;
public static void main(String[] args) {
log = Logger.getLogger(LogTest.class);
}
}
...そしてorg.Apache.log4j.helpers.Loader#getResourceメソッドにブレークポイントを設定します。クラスローダーからlog4j.xmlをプルしようとします。
url = classLoader.getResource(resource);
したがって、クラスローダーの内部を簡単に調べて、クラスローダーが使用するパス(およびlog4j.xmlが見つからない理由)を確認できます。
プロジェクトで使用されたライブラリのすべてのモジュールの後にlog4jライブラリがコンパイルされたことも非常に重要です。これを最後のオブジェクトとして設定しない場合、後のモジュール/ライブラリからのログは、log4j.propertiesの標準的な方法で表示されません。
頭に浮かぶ可能性が最も高い2つのことは次のとおりです。
一部のデプロイメントシナリオで機能しているため、Maven経由で実行する場合の戦争パッケージが問題であると思われます。上記の点は、これを確認するのに役立つはずです。