我有一个logback的问题.我设置它(使用maven)并且一切似乎都很好,除了Logback报告它找不到配置文件(但我能够使用默认的记录器配置登录到控制台).
[#| 2013-07-03T07:55:30.843 + 0200 | INFO | glassfish3.1.2 | javax.enterprise.system.std.com.sun.enterprise.server.logging | _ThreadID = 124; _ThreadName =线程2; | 07:54:39,844 | -INFO in ch.qos.logback.classic.LoggerContext [default] - 无法找到资源[logback.groovy]
07:54:39,844 | -INFO in ch.qos.logback.classic.LoggerContext [default] - 无法找到资源[logback-test.xml]
07:54:39,844 | -INFO in ch.qos.logback.classic.LoggerContext [default] - 无法找到资源[logback.xml]
07:54:39,847 | -INFO in ch.qos.logback.classic.LoggerContext [default] - 设置默认配置.|#]
我将配置文件(称为logback.xml)放入src/main/resources我的Maven工件(这是一个WAR)的文件夹中.有趣的是,如果我尝试从类路径加载配置,我成功:
Reader r = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("logback.xml"));
StringWriter sw = new StringWriter();
char[] buffer = new char[1024];
for (int n; (n = r.read(buffer)) != -1; )
sw.write(buffer, 0, n); …Run Code Online (Sandbox Code Playgroud) 我的一个项目打包为一个EAR文件,其中包含SLF4J API(1.7.5)以及作为其实现(logback-core 1.0.13和logback-classic 1.0.13)的logback库.
当我(以前)部署我的项目时,SLF4J的LoggerFactory发现logback尽可能绑定并使用正确的记录器(即logback).
现在我有一个资源连接器(activemq-rar-5.8.0.rar),它在我自己的EAR文件之前部署(因为EAR文件需要RAR).不幸的是,这个RAR包含自己的SLF4J实现(slf4j-api-1.6.6.jar slf4j-log4j12-1.6.6.jar log4j-1.2.17.jar).RAR文件使用log4j实现.
当我部署我的EAR文件时,我的应用程序代码中的LoggerFactory突然使用log4j实现(org.slf4j.impl.Log4jLoggerAdapter) - 即使我希望类路径与RAR分离.
这似乎不是这样 - 所以我做错了什么(RAR应该使用log4j,我的EAR应该使用logback)?
更新1: 看起来我并不孤单,但不幸的是,答案遗失了......
更新2:
根据此表,GlassFish在EAR/WAR库之前加载连接器模块(这是最后要加载的库).
更新3:
我设法修复了"绑定":如果我将slf4j-api-1.7.5.jar和logback实现(logback-core-1.0.13.jar和logback-classic-1.0.13.jar)放在domains/<myDomain>/libGlassFish 的文件夹中,则logback将用作日志记录实现(请参阅Update 2 - "Common Classloader"在"Connector Classloader"之前).
不幸的是我的配置文件不再存在,因为它们在WAR/EAR中 - 稍后将由不同的类加载器("Archive Classloader")加载.
所以这对我来说并不是真正的解决方案,因为我希望将回溯配置文件保留在EAR/WAR中(因为每个应用程序都使用不同的配置).
亲切的问候
stupidSheep
我有一个有点奇怪的问题.我目前正在使用Arquillian(1.1.0.Final)和Embedded GlassFish(3.1.2.2).我使用以下指南来设置我的小测试项目.使用集成的Derby数据库,一切正常.我的真实应用程序使用PostgreSQL作为数据库,因此我按如下方式配置了GlassFish资源:
<!-- See http://jdbc.postgresql.org/documentation/91/ds-cpds.html -->
<jdbc-connection-pool name="MyPostgresqlPool"
res-type="javax.sql.DataSource"
datasource-classname="org.postgresql.ds.PGSimpleDataSource"
is-isolation-level-guaranteed="false">
<property name="user" value="..." />
<property name="databaseName" value="..." />
<property name="password" value="..." />
<property name="serverName" value="..." />
<property name="portNumber" value="..." />
</jdbc-connection-pool>
Run Code Online (Sandbox Code Playgroud)
我按照上面指南中的描述访问持久化上下文和用户事务:
@RunWith(Arquillian.class)
public class AddressModuleTest extends BaseTest {
@PersistenceContext
protected EntityManager em;
@Inject
protected UserTransaction utx;
@Before
public void setUp() throws Exception {
utx.begin();
em.joinTransaction();
}
@After
public void tearDown() throws Exception {
utx.rollback();
}
[ ... snip ...]
}
Run Code Online (Sandbox Code Playgroud)
如果我运行我的测试类(AddressModuleTest,请注意"BaseTest"有一个用@Deployment注释为Arquillian的静态方法)一切都很好,我可以从PostgreSQL数据库中读取我的数据.
不幸的是,如果我创建第二个测试类,它将无法工作:
@RunWith(Arquillian.class)
public class CommunicationModuleTest …Run Code Online (Sandbox Code Playgroud)