2016-11-29 6 views
0

Ich habe eine Anwendung entwickelt, die verwendet wird, um Protokoll in Datenbank mit log4j2.xml mit JDBCAppender aufzeichnen. Ich habe die folgende Anweisung hier folgt: - http://self-learning-java-tutorial.blogspot.in/2015/10/log4j2-jdbcappender-write-log-messages.html
My DB ConnectionFactory- Klasse ist wie folgt: -ClassNotFound von der freigegebenen Bibliothek 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(); 
     } 
    } 

und mein log4j2.xml Schnipsel ist wie folgt: -

<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> 

Jetzt funktioniert alles einwandfrei und ich kann das Protokoll in DB sehen.

Aber wenn ich dieses Projekt als JAR-Datei exportieren, um es zu einem gemeinsamen Shared Library Jar zu machen und es in anderen Anwendungen als Abhängigkeit zu verwenden, stoße ich auf ClassNotFoundException.

Also, wenn ich die Anwendung starten, die diese gemeinsame JAR-Datei als Abhängigkeit hat, erhalte ich die folgende: -

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) 

ich nicht sicher, warum dies ConnectionFactory- Java-Klasse wird nicht in die Classpath immer in der shared jar, funktioniert aber gut, wenn dies als eine oben erwähnte Anwendung ausgeführt wird.

Bitte schlagen Sie vor, wie Sie die ConnectionFactory-Java-Klasse in den Klassenpfad im Jar einfügen? Muss ich also eine Änderung in meiner log4j2.xml vornehmen?

+0

Nebenbei ist die Verwendung des Standardpakets eine schlechte Praxis. Sie haben uns jedoch nicht die gesamte ConnectionFactory.java-Datei angezeigt, daher ist es möglich, dass Sie _have_ ein Paket deklariert haben, das die Ursache Ihrer Probleme sein könnte. – rmlan

+0

Ich stimme zu Standard-Paket ist eine schlechte Praxis. Ich mache eine POC und ich habe die Java-Klasse von einem Paket in den Standard verschoben. Wie auch immer das ist der gesamte JAVA-Code eingefügt –

+0

bearbeitet und eingefügt den Code –

Antwort

0

Haben Sie beim Exportieren von jar in eclipse alle Ressourcen ausgewählt? Überprüfen Sie auch, ob es hilft: Java: export to an .jar file in eclipse

+0

Erledigt das gleiche ... aber kein Glück :( –

+0

Wie fügst du dieses Jar als Abhängigkeit in eine andere Anwendung ein? Wenn eine andere Anwendung, die diese Abhängigkeit hat, eine JAR-Datei ist, versuche die Abhängigkeit mit -classpath hinzuzufügen: – pooja

+0

(Weiterer vorheriger Kommentar): java -classpath dependency1.jar; Unterordner/dependency2.jar; myapp.jar package.of.your.main.Class oder wenn es eine Webapp ist, versuchen Sie, jar zu tomcat_dir/WEB-INF/lib hinzuzufügen – pooja

0

Können Sie versuchen, den voll qualifizierten Klassennamen zu verwenden? Überprüfen Sie außerdem, ob auf die Klasse über den XML-Pfad zugegriffen werden kann.

+0

Ja ... es ist tatsächlich funktioniert, wenn es als eine Anwendung ausgeführt wird, aber wenn es als ein Glas in einer anderen Anwendung verwendet wird, funktioniert es nicht :( –

Verwandte Themen