来自共享库jar的ClassNotFound

时间:2016-11-29 18:27:29

标签: java java-ee log4j2 log4jdbc

我开发了一个应用程序,用于使用JDBCAppender使用log4j2.xml将记录记录到数据库中。我在这里遵循了以下说明: - http://self-learning-java-tutorial.blogspot.in/2015/10/log4j2-jdbcappender-write-log-messages.html
我的DB ConnectionFactory类如下: -

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", "Login@123"); // 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>

现在一切正常,我可以看到登录数据库。

但是当我将这个项目导出为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中进行修改吗?

3 个答案:

答案 0 :(得分:0)

您是否在eclipse中导出jar时选择了所有资源? 另外,请查看是否有帮助:Java: export to an .jar file in eclipse

答案 1 :(得分:0)

您可以尝试使用完全合格的班级名称吗? 另外,检查是否可以从xml路径访问该类。

答案 2 :(得分:0)