Ведение журнала из модуля EJB в JavaEE, конфигурация maven - PullRequest
1 голос
/ 18 октября 2010

Я часами пытался заставить мой проект работать, но 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

основной 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>

Ушная пом.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>

и EJB SimpleStateless.java:

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 работает (регистрация сервлетов + регистрация EJB с использованием каталога WEB-INF / lib), и, как я обнаружил, регистрация в EJB должна работать при развертывании ear (если манифест правильный) .

Что я делаю не так?

1 Ответ

0 голосов
/ 18 октября 2010

Глядя на разобранную упаковку ear и манифест ejb.jar,

nnWeb-ejb.jar находится в той же иерархии, что и APP-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
...