小编stu*_*eep的帖子

即使它存在(在类路径上),Logback也找不到logback.xml

我有一个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)

java war logback maven

8
推荐指数
1
解决办法
3万
查看次数

SLF4J - 绑定被同一应用程序服务器上的其他应用程序覆盖

我的一个项目打包为一个EAR文件,其中包含SLF4J API(1.7.5)以及作为其实现(logback-core 1.0.13logback-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.jarlogback-classic-1.0.13.jar)放在domains/<myDomain>/libGlassFish 的文件夹中,则logback将用作日志记录实现(请参阅Update 2 - "Common Classloader"在"Connector Classloader"之前).

不幸的是我的配置文件不再存在,因为它们在WAR/EAR中 - 稍后将由不同的类加载器("Archive Classloader")加载.

所以这对我来说并不是真正的解决方案,因为我希望将回溯配置文件保留在EAR/WAR中(因为每个应用程序都使用不同的配置).


亲切的问候

stupidSheep

java activemq-classic glassfish classpath slf4j

6
推荐指数
1
解决办法
1677
查看次数

Arquillian在第一个测试类之后无法注入依赖项

我有一个有点奇怪的问题.我目前正在使用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)

java datasource jdbc jboss-arquillian postgresql-9.1

4
推荐指数
1
解决办法
5131
查看次数