2016-11-29 2 views
0

Я разработал приложение, которое используется для записи журнала в базу данных с помощью log4j2.xml с использованием JDBCAppender. Я следовал следующей инструкции здесь: - http://self-learning-java-tutorial.blogspot.in/2015/10/log4j2-jdbcappender-write-log-messages.html
Мой DB ConnectionFactory класс выглядит следующим образом: -ClassNotFound из общей библиотеки jar

импорта 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> 

Теперь все работает отлично, и я могу видеть бревно в БД.

Но когда я экспортирую этот проект в виде файла jar, чтобы сделать его общим банком общей библиотеки и использовать его в других приложениях как зависимость, я столкнулся с ClassNotFoundException.

Таким образом, всякий раз, когда я запустить приложение, которое имеет этот общий файл фляги, как зависимость, я получаю следующее: -

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 не получает в пути к классам в но работает отлично, когда это выполняется как приложение, упомянутое выше.

Просьба предложить, как включить класс java ConnectionFactory в classpath в банке? Так что мне нужно сделать модификацию в моем log4j2.xml?

+0

Как в стороне, использование пакета по умолчанию - это плохая практика. Однако вы не показали нам весь файл ConnectionFactory.java, поэтому возможно, что вы _have_ объявили пакет, что послужило бы причиной ваших проблем. – rmlan

+0

Я согласен, что пакет по умолчанию - плохая практика. Я делаю POC, и я фактически переместил класс java из пакета в default. в любом случае это весь код JAVA, вставленный –

+0

, отредактированный и вставленный код –

ответ

0

Вы выбрали все ресурсы при экспорте банки в eclipse? Кроме того, ознакомьтесь, если это поможет: Java: export to an .jar file in eclipse

+0

Выполнено то же самое ... но не повезло :( –

+0

Как вы добавляете эту банку в качестве зависимости в другом приложении? Если другое приложение, которое имеет эту зависимость, является файлом jar, попробуйте добавить зависимость с -classpath: – pooja

+0

(Продолжая предыдущий комментарий): java -classpath dependency1.jar; вложенная папка/dependency2.jar; myapp.jar package.of.your.main.Class или если ее webapp, попробуйте добавить jar в tomcat_dir/WEB-INF/lib – pooja

0

Можете ли вы попробовать использовать полное имя класса? Кроме того, убедитесь, что класс доступен из пути xml.

+0

Да ... это фактически работает, когда он запускается как приложение, но при использовании в качестве банки в другом приложении он не работает :( –

Смежные вопросы