从 JavaEE 中的 EJB 模块记录日志,maven 配置

发布于 2024-09-28 02:09:03 字数 13436 浏览 2 评论 0原文

我已经尝试了几个小时让我的项目正常工作,但 EJB 部分仍然失败,并出现 java.lang.ClassNotFoundException: org.slf4j.LoggerFactory (我想在我的 EJB 中输出一些日志)。

项目的布局如下:

|-- nnWeb-ear
|   |-- pom.xml
|   `-- src
|       `-- main
|           |-- application
|           |   `-- META-INF
|           |       `-- MANIFEST.MF
|           `-- java
|-- nnWeb-ejb
|   |-- pom.xml
|   `-- src
|       |-- main
|       |   |-- java
|       |   |   `-- com
|       |   |       `-- test
|       |   |           `-- packaging
|       |   |               `-- SimpleStateLess.java
|       |   `-- resources
|       |       |-- logback.xml
|       |       `-- META-INF
|       |           `-- MANIFEST.MF
|       `-- test
|           `-- java
|               `-- com
|                   `-- test
|                       `-- packaging
|-- nnWeb-web
|   |-- pom.xml
|   `-- src
|       |-- main
|       |   |-- java
|       |   |   `-- com
|       |   |       `-- test
|       |   |           `-- packaging
|       |   |               |-- SimpleEJB.java
|       |   |               `-- SimpleServlet.java
|       |   |-- resources
|       |   |   `-- logback.xml
|       |   `-- webapp
|       |       |-- index.jsp
|       |       `-- WEB-INF
|       |           `-- sun-web.xml
|       `-- test
|           `-- java
`-- pom.xml

main pom.xml :

<?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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test.packaging</groupId>
  <artifactId>nnWeb</artifactId>
  <packaging>pom</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>nnWeb</name>
  <url>http://maven.apache.org</url>
  <modules>
    <module>nnWeb-ear</module>
    <module>nnWeb-web</module>
    <module>nnWeb-ejb</module>
  </modules>
</project>

ejb pom.xml:

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>nnWeb</artifactId>
        <groupId>com.test.packaging</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.test.packaging</groupId>
    <artifactId>nnWeb-ejb</artifactId>
    <packaging>ejb</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>nnWebEjb</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>0.9.18</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.5.11</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>java.net2</id>
            <name>Java.Net Maven2 Repository, hosts the javaee-api dependency</name>
            <url>http://download.java.net/maven/2</url>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ejb-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <ejbVersion>3.1</ejbVersion>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>APP-INF/lib</classpathPrefix>
                        </manifest>
                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
                    </archive>
                </configuration>

            </plugin>
        </plugins>
        <finalName>nnWeb-ejb</finalName>
    </build>
    <profiles>
        <profile>
            <id>endorsed</id>
            <activation>
                <property>
                    <name>sun.boot.class.path</name>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>2.0.2</version>
                        <configuration>
                            <!-- javaee6 contains upgrades of APIs contained within the JDK itself.
                                 As such these need to be placed on the bootclasspath, rather than classpath of the
                                 compiler.
                                 If you don't make use of these new updated API, you can delete the profile.
                                 On non-SUN jdk, you will need to create a similar profile for your jdk, with the similar property as sun.boot.class.path in Sun's JDK.-->
                            <compilerArguments>
                                <bootclasspath>${settings.localRepository}/javax/javaee-endorsed-api/6.0/javaee-endorsed-api-6.0.jar${path.separator}${sun.boot.class.path}</bootclasspath>
                            </compilerArguments>
                        </configuration>
                        <dependencies>
                            <dependency>
                                <groupId>javax</groupId>
                                <artifactId>javaee-endorsed-api</artifactId>
                                <version>6.0</version>
                            </dependency>
                        </dependencies>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
    <properties>
        <netbeans.hint.deploy.server>gfv3ee6</netbeans.hint.deploy.server>
    </properties>
</project>

Ear pom.xml:

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>nnWeb</artifactId>
        <groupId>com.test.packaging</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.test.packaging</groupId>
    <artifactId>nnWeb-ear</artifactId>
    <packaging>ear</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>nnWebEar</name>
    <url>http://maven.apache.org</url>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <version>6</version>
                   <!-- <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                        </manifest>
                        </archive>-->
                        <defaultJavaBundleDir>APP-INF/lib</defaultJavaBundleDir>
                </configuration>
            </plugin>

                    <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>process-classes</phase>
                        <goals>

                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <finalName>nnWeb-ear</finalName>
    </build>
    <dependencies>
        <dependency>
            <groupId>com.test.packaging</groupId>
            <artifactId>nnWeb-ejb</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>ejb</type>
        </dependency>
        <dependency>
            <groupId>com.test.packaging</groupId>
            <artifactId>nnWeb-web</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>war</type>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>0.9.18</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.5.11</version>
        </dependency>
        <dependency>
            <groupId>com.googlecode.sli4j</groupId>
            <artifactId>sli4j-slf4j-jdk14</artifactId>
            <version>2.0</version>
        </dependency>
    </dependencies>
    <properties>
        <netbeans.hint.deploy.server>gfv3ee6</netbeans.hint.deploy.server>
    </properties>
</project>

和 SimpleStateless.java EJB:

package com.test.packaging;

import javax.ejb.Stateless;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Stateless
public class SimpleStateLess {
     private static Logger logger = LoggerFactory.getLogger(SimpleStateLess.class);

   public void constructLog(){
       logger.debug("Finally got logging working in ejb module :)");
   }
}

打包后,ear 文件如下所示:

|-- APP-INF
|   `-- lib
|       |-- aopalliance-1.0.jar
|       |-- guice-2.0.jar
|       |-- logback-classic-0.9.18.jar
|       |-- logback-core-0.9.18.jar
|       |-- slf4j-api-1.5.11.jar
|       |-- slf4j-jdk14-1.5.10.jar
|       |-- sli4j-core-2.0.jar
|       `-- sli4j-slf4j-jdk14-2.0.jar
|-- META-INF
|   |-- application.xml
|   |-- MANIFEST.MF
|   `-- maven
|       `-- com.test.packaging
|           `-- nnWeb-ear
|               |-- pom.properties
|               `-- pom.xml
|-- ngWeb-web.war
`-- nnWeb-ejb.jar

ejb.jar 清单为:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: dev
Build-Jdk: 1.6.0_21
Class-Path: APP-INF/lib/logback-classic-0.9.18.jar APP-INF/lib/logback
 -core-0.9.18.jar APP-INF/lib/slf4j-api-1.5.11.jar

请注意,从 war 包进行日志记录是有效的(Servlet 日志记录 + 使用 WEB-INF/lib 目录的 EJB 日志记录),并且根据我的发现,在部署 Ear 时,EJB 中的日志记录应该可以工作(如果清单正确)。

我做错了什么?

I have tried for hours to get my project working but the EJB part is still failing with a java.lang.ClassNotFoundException: org.slf4j.LoggerFactory (I want to output some log in my EJB).

The layout of the project is the following:

|-- nnWeb-ear
|   |-- pom.xml
|   `-- src
|       `-- main
|           |-- application
|           |   `-- META-INF
|           |       `-- MANIFEST.MF
|           `-- java
|-- nnWeb-ejb
|   |-- pom.xml
|   `-- src
|       |-- main
|       |   |-- java
|       |   |   `-- com
|       |   |       `-- test
|       |   |           `-- packaging
|       |   |               `-- SimpleStateLess.java
|       |   `-- resources
|       |       |-- logback.xml
|       |       `-- META-INF
|       |           `-- MANIFEST.MF
|       `-- test
|           `-- java
|               `-- com
|                   `-- test
|                       `-- packaging
|-- nnWeb-web
|   |-- pom.xml
|   `-- src
|       |-- main
|       |   |-- java
|       |   |   `-- com
|       |   |       `-- test
|       |   |           `-- packaging
|       |   |               |-- SimpleEJB.java
|       |   |               `-- SimpleServlet.java
|       |   |-- resources
|       |   |   `-- logback.xml
|       |   `-- webapp
|       |       |-- index.jsp
|       |       `-- WEB-INF
|       |           `-- sun-web.xml
|       `-- test
|           `-- java
`-- pom.xml

the main pom.xml :

<?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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test.packaging</groupId>
  <artifactId>nnWeb</artifactId>
  <packaging>pom</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>nnWeb</name>
  <url>http://maven.apache.org</url>
  <modules>
    <module>nnWeb-ear</module>
    <module>nnWeb-web</module>
    <module>nnWeb-ejb</module>
  </modules>
</project>

The ejb pom.xml:

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>nnWeb</artifactId>
        <groupId>com.test.packaging</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.test.packaging</groupId>
    <artifactId>nnWeb-ejb</artifactId>
    <packaging>ejb</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>nnWebEjb</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>0.9.18</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.5.11</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>java.net2</id>
            <name>Java.Net Maven2 Repository, hosts the javaee-api dependency</name>
            <url>http://download.java.net/maven/2</url>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ejb-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <ejbVersion>3.1</ejbVersion>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>APP-INF/lib</classpathPrefix>
                        </manifest>
                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
                    </archive>
                </configuration>

            </plugin>
        </plugins>
        <finalName>nnWeb-ejb</finalName>
    </build>
    <profiles>
        <profile>
            <id>endorsed</id>
            <activation>
                <property>
                    <name>sun.boot.class.path</name>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>2.0.2</version>
                        <configuration>
                            <!-- javaee6 contains upgrades of APIs contained within the JDK itself.
                                 As such these need to be placed on the bootclasspath, rather than classpath of the
                                 compiler.
                                 If you don't make use of these new updated API, you can delete the profile.
                                 On non-SUN jdk, you will need to create a similar profile for your jdk, with the similar property as sun.boot.class.path in Sun's JDK.-->
                            <compilerArguments>
                                <bootclasspath>${settings.localRepository}/javax/javaee-endorsed-api/6.0/javaee-endorsed-api-6.0.jar${path.separator}${sun.boot.class.path}</bootclasspath>
                            </compilerArguments>
                        </configuration>
                        <dependencies>
                            <dependency>
                                <groupId>javax</groupId>
                                <artifactId>javaee-endorsed-api</artifactId>
                                <version>6.0</version>
                            </dependency>
                        </dependencies>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
    <properties>
        <netbeans.hint.deploy.server>gfv3ee6</netbeans.hint.deploy.server>
    </properties>
</project>

The ear pom.xml:

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>nnWeb</artifactId>
        <groupId>com.test.packaging</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.test.packaging</groupId>
    <artifactId>nnWeb-ear</artifactId>
    <packaging>ear</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>nnWebEar</name>
    <url>http://maven.apache.org</url>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <version>6</version>
                   <!-- <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                        </manifest>
                        </archive>-->
                        <defaultJavaBundleDir>APP-INF/lib</defaultJavaBundleDir>
                </configuration>
            </plugin>

                    <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>process-classes</phase>
                        <goals>

                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <finalName>nnWeb-ear</finalName>
    </build>
    <dependencies>
        <dependency>
            <groupId>com.test.packaging</groupId>
            <artifactId>nnWeb-ejb</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>ejb</type>
        </dependency>
        <dependency>
            <groupId>com.test.packaging</groupId>
            <artifactId>nnWeb-web</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>war</type>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>0.9.18</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.5.11</version>
        </dependency>
        <dependency>
            <groupId>com.googlecode.sli4j</groupId>
            <artifactId>sli4j-slf4j-jdk14</artifactId>
            <version>2.0</version>
        </dependency>
    </dependencies>
    <properties>
        <netbeans.hint.deploy.server>gfv3ee6</netbeans.hint.deploy.server>
    </properties>
</project>

and the SimpleStateless.java EJB:

package com.test.packaging;

import javax.ejb.Stateless;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Stateless
public class SimpleStateLess {
     private static Logger logger = LoggerFactory.getLogger(SimpleStateLess.class);

   public void constructLog(){
       logger.debug("Finally got logging working in ejb module :)");
   }
}

Once packaged, the ear file looks like:

|-- APP-INF
|   `-- lib
|       |-- aopalliance-1.0.jar
|       |-- guice-2.0.jar
|       |-- logback-classic-0.9.18.jar
|       |-- logback-core-0.9.18.jar
|       |-- slf4j-api-1.5.11.jar
|       |-- slf4j-jdk14-1.5.10.jar
|       |-- sli4j-core-2.0.jar
|       `-- sli4j-slf4j-jdk14-2.0.jar
|-- META-INF
|   |-- application.xml
|   |-- MANIFEST.MF
|   `-- maven
|       `-- com.test.packaging
|           `-- nnWeb-ear
|               |-- pom.properties
|               `-- pom.xml
|-- ngWeb-web.war
`-- nnWeb-ejb.jar

and the ejb.jar manifest is:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: dev
Build-Jdk: 1.6.0_21
Class-Path: APP-INF/lib/logback-classic-0.9.18.jar APP-INF/lib/logback
 -core-0.9.18.jar APP-INF/lib/slf4j-api-1.5.11.jar

Note that logging from the war package works (Servlet logging + EJB logging using the WEB-INF/lib directory) and according to what I found, logging in the EJB should work when deploying the ear (if the manifest is correct).

What am I doing wrong ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

云雾 2024-10-05 02:09:04

查看分解的 ear 包装和 ejb.jar 清单,

nnWeb-ejb.jarAPP- 位于同一层次结构中INF

因此,以下 Class-Path 条目变得无效......

Class-Path: APP-INF/lib/logback-classic-0.9.18.jar APP-INF/lib/logback
 -core-0.9.18.jar APP-INF/lib/slf4j-api-1.5.11.jar

它们需要

Class-Path: ../APP-INF/lib/logback-classic-0.9.18.jar ../APP-INF/lib/logback
 -core-0.9.18.jar ../APP-INF/lib/slf4j-api-1.5.11.jar

Looking at the exploded ear packaging and the ejb.jar manifest,

nnWeb-ejb.jar is in the same hierarchy as APP-INF.

Thus the following Class-Path entries become invalid...

Class-Path: APP-INF/lib/logback-classic-0.9.18.jar APP-INF/lib/logback
 -core-0.9.18.jar APP-INF/lib/slf4j-api-1.5.11.jar

They would need to be

Class-Path: ../APP-INF/lib/logback-classic-0.9.18.jar ../APP-INF/lib/logback
 -core-0.9.18.jar ../APP-INF/lib/slf4j-api-1.5.11.jar
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文