2016-11-29 22 views
0

我开发了一个应用程序,用于使用JDBCAppender将日志记录到数据库log4j2.xml中。我在此处遵循以下指令: - http://self-learning-java-tutorial.blogspot.in/2015/10/log4j2-jdbcappender-write-log-messages.html
我的DB ConnectionFactory类如下所示: -来自共享库jar的类未找到

import java.sql.Connection;

import java.sql.SQLException; 
import java.util.Properties; 

import javax.sql.DataSource; 

import org.apache.commons.dbcp.DriverManagerConnectionFactory; 
import org.apache.commons.dbcp.PoolableConnection; 
import org.apache.commons.dbcp.PoolableConnectionFactory; 
import org.apache.commons.dbcp.PoolingDataSource; 
import org.apache.commons.pool.impl.GenericObjectPool; 
    public class ConnectionFactory { 
     private static interface Singleton { 
      final ConnectionFactory INSTANCE = new ConnectionFactory(); 
     } 

     private final DataSource dataSource; 

     private ConnectionFactory() { 
      Properties properties = new Properties(); 
      properties.setProperty("user", "sa"); 
      properties.setProperty("password", "[email protected]"); // or get properties from some configuration file 

      GenericObjectPool<PoolableConnection> pool = new GenericObjectPool<PoolableConnection>(); 
      DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
        "jdbc:sqlserver://SERV1-PC\\SQLEXPRESS:1433;databaseName=Anirban;", properties 
      ); 
      new PoolableConnectionFactory(
        connectionFactory, pool, null, "SELECT 1", 3, false, false, Connection.TRANSACTION_READ_COMMITTED 
      ); 

      this.dataSource = new PoolingDataSource(pool); 
     } 
     public static Connection getDatabaseConnection() throws SQLException { 
      return Singleton.INSTANCE.dataSource.getConnection(); 
     } 
    } 

和我log4j2.xml摘录如下: -

<Appenders> 
<JDBC name="databaseAppender" tableName="LogTable"> 
    <ConnectionFactory class="ConnectionFactory" method="getDatabaseConnection" /> 
    <Column name="EVENT_DATE" isEventTimestamp="true" /> 
    <Column name="LEVEL" pattern="%level" /> 
    <Column name="LOGGER" pattern="%logger" /> 
    <Column name="MESSAGE" pattern="%message" /> 
    <Column name="THROWABLE" pattern="%ex{full}" /> 
    </JDBC> 

</Appenders> 

<AsyncRoot level="INFO" > 
<AppenderRef ref="databaseAppender" /> 
</AsyncRoot> 

现在一切正常,我可以看到在日志中DB。

但是,当我将该项目导出为jar文件以使其成为公用共享库jar并在其他应用程序中用作依赖项时,遇到了ClassNotFoundException。

所以,每当我开始有这个共享的jar文件的依赖应用程序,我得到如下: -

ERROR java.lang.ClassNotFoundException: ConnectionFactory java.lang.ClassNotFoundException: ConnectionFactory 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.Class.forName0(Native Method) 

我一个不知道为什么这ConnectionFactory的java类没有进入类路径中共享jar,但是当它作为上面提到的应用程序运行时工作正常。

请问如何在jar包中的classpath中包含ConnectionFactory java类?那么我需要在log4j2.xml中进行修改吗?

+0

另外,使用默认包是一种不好的做法。但是,您没有向我们展示整个ConnectionFactory.java文件,因此可能您_have_声明了一个包,这可能是您遇到问题的原因。 – rmlan

+0

我同意默认包是一个不好的做法。我正在做一个POC,我实际上将java包从一个包转换为默认值。反正这是整个JAVA代码粘贴 –

+0

编辑粘贴代码 –

回答

0

你在eclipse中导出jar文件时选择了所有的资源吗? 另外,看看是否有帮助:Java: export to an .jar file in eclipse

+0

完成相同...但没有运气:( –

+0

如何将此jar添加为另一个应用程序的依赖项?如果另一个具有此依赖项的应用程序是jar文件,请尝试使用-classpath添加依赖项: – pooja

+0

(继续之前的评论):java -classpath dependency1.jar; subfolder/dependency2.jar; myapp.jar package.of.your.main.Class或者如果它的webapp,尝试添加jar到tomcat_dir/WEB-INF/lib – pooja

0

你可以尝试使用完全合格的类名吗? 此外,请检查该类是否可从xml路径访问。

+0

是的......它是实际上当它作为应用程序运行时工作,但当作为其他应用程序的jar使用时,它不工作:( –