这看起来非常接近此线程中描述的问题,我怀疑存在类似的类加载问题。由于logback加载的方式
logback.xml(更确切地说是它获取a的方式
ClassLoader),它可能无法获取其配置文件并退回default
BasicConfiguration。
不确定如何打包代码,但是建议的解决方法是将
logback.xmlEAR库中包含。如果您不使用EAR包装,请尝试标识用于查看将
logback.xml文件放置在何处的类加载器。
最后,这可能是登录后的问题。不过没有检查他们的问题跟踪器。
更新: 如果使用战争包装,请尝试将GlassFish配置为在委托之前先使用子类加载器。在sun-web.xml
:
<sun-web-app> <class-loader delegate="false"/></sun-web-app>
更新: 我做了一些测试,但是…我无法重现您的问题。我为Java EE 6 Webapp创建了一个项目,该项目具有以下结构:
$树样本样品|-pom.xml`-src `-主要 |-Java | `-com | `-stackoverflow | `-q2418355 | |-SimpleEJB.java | `-SimpleServlet.java |-资源 | `-logback.xml `-webapp |-meta-INF | `-MANIFEST.MF |-WEB-INF | `-lib `-index.jsp
我的pom.xml看起来像:
<?xml version="1.0" encoding="UTF-8"?><project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <groupId>com.stackoverflow.q2418355</groupId> <artifactId>sample</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>sample Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </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> </dependencies> <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-war-plugin</artifactId> <version>2.1-beta-1</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> <finalName>sample</finalName> </build></project>
的代码
SimpleEJB.java是:
package com.stackoverflow.q2418355;import javax.ejb.Stateless;import org.slf4j.Logger;import org.slf4j.LoggerFactory;@Statelesspublic class SimpleEJB { private static Logger logger = LoggerFactory.getLogger(SimpleEJB.class); public String sayHello(String name) { logger.debug(">> sayHello()"); logger.debug("<< sayHello()"); return "Hello " + name + "!!!"; }}的代码
SimpleServlet.java是:
package com.stackoverflow.q2418355;import java.io.IOException;import java.io.PrintWriter;import javax.ejb.EJB;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet(urlPatterns = { "/SimpleServlet" })public class SimpleServlet extends HttpServlet { @EJB SimpleEJB bean; private static Logger logger = LoggerFactory.getLogger(SimpleServlet.class); @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { logger.debug(">> doGet()"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h2>Serving at: " + request.getContextPath() + "</h2>"); out.println("<h2>Invoking EJB: " + bean.sayHello("Duke") + "</h2>"); out.println("</body></html>"); logger.debug("<< doGet()"); }}的代码
index.jsp是:
<html><body><h2>Hello World!</h2>Invoke the Servlet by clicking <a href="SimpleServlet">here</a>.</body></html>
和我的
logback.xml样子:
<configuration> <appender name="STDOUT" > <layout > <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern> </layout> </appender> <appender name="FILE" > <File>/tmp/logs/testFile.log</File> <Append>true</Append> <layout > <Pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</Pattern> </layout> </appender> <logger name="com.stackoverflow.q2418355" level="TRACE"/> <root level="debug"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root></configuration>我
logback.xml被propertly加载和我碰到下面的跟踪调用Servlet时(从我的日志文件中获取):
10913 [http-thread-pool-8080-(1)] DEBUG com.stackoverflow.q2418355.SimpleServlet - >> doGet()10928 [http-thread-pool-8080-(1)] DEBUG com.stackoverflow.q2418355.SimpleEJB - >> sayHello()10928 [http-thread-pool-8080-(1)] DEBUG com.stackoverflow.q2418355.SimpleEJB - << sayHello()10932 [http-thread-pool-8080-(1)] DEBUG com.stackoverflow.q2418355.SimpleServlet - << doGet()
我也尝试过将EJB打包在自己的JAR中并部署在其中,
WEB-INF/lib并获得相同的结果,它可以正常工作。你能发现明显的不同吗?也许上传您的应用程序的简化版本(错误报告BTW非常可能需要)。
我正在Eclipse 3.5(带有GlassFish v3插件)下运行GlassFish v3。



