Я разработал приложение, которое используется для записи журнала в базу данных с помощью 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?
Как в стороне, использование пакета по умолчанию - это плохая практика. Однако вы не показали нам весь файл ConnectionFactory.java, поэтому возможно, что вы _have_ объявили пакет, что послужило бы причиной ваших проблем. – rmlan
Я согласен, что пакет по умолчанию - плохая практика. Я делаю POC, и я фактически переместил класс java из пакета в default. в любом случае это весь код JAVA, вставленный –
, отредактированный и вставленный код –