2016-11-30 18 views
0

データベースプーリングを使用するMavenプロジェクトを実行しようとしています。 実際に私のコードはEclipse上で正しく動作し、出力が得られます。私のコードは次のようになります:スレッド "main"の例外java.lang.NoClassDefFoundError:org/apache/commons/dbcp2/BasicDataSource

package pack; 

import org.apache.commons.dbcp2.BasicDataSource; 

import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class App { 

    private final String CONNECTION_URL = "jdbc:derby:memory:test;create=true"; 

    private BasicDataSource ds; 

    //private Connection classicalWay() throws SQLException { 
    // return DriverManager.getConnection(CONNECTION_URL); 
    //} 

    public static void main(String[] args) { 
     final App app = new App(); 
     app.process(); 
    } 

    private Connection poolWay() throws SQLException { 
     if (ds == null) { 
      ds = new BasicDataSource(); 
      ds.setUrl(CONNECTION_URL); 
      ds.setMaxTotal(10); 
     } 
     return ds.getConnection(); 
    } 

    private Connection getConnection() throws SQLException { 
     return poolWay(); 
     //return classicalWay(); 
    } 

    private void createTable(final Statement stmt) throws SQLException { 
     stmt.execute("CREATE TABLE CUSTOMER (NAME VARCHAR(10))"); 
    } 

    private void insertRecord(final Statement stmt) throws SQLException { 
     stmt.execute("INSERT INTO CUSTOMER (NAME) VALUES ('James')"); 
    } 

    private void selectTable(Statement stmt) throws SQLException { 
     final ResultSet rs = stmt.executeQuery("SELECT * FROM CUSTOMER"); 
     while (rs.next()) 
      System.out.println(rs.getString(1)); 
    } 

    public void process() { 
     try { 
      final Connection con = getConnection(); 
      try { 
       final Statement stmt = con.createStatement(); 
       try { 
        createTable(stmt); 
        insertRecord(stmt); 
        selectTable(stmt); 
       } finally { 
        stmt.close(); 
       } 
      } finally { 
       con.close(); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

}     

私はコンソール上で出力 "James"を得ることができました。また、私は必要な.jarファイルを持っています。 私はすでにダービー、derbyclient、コモンズ・dbcp2(バージョン2.1.1)、(バージョン1.2)をログ記録 コモンズ、コモンズ・POOL2、(バージョン2.4.2)を輸入していると、次のように私のpom.xmlがある:

  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
       <modelVersion>4.0.0</modelVersion> 

       <groupId>oguzbayral.trial.dummy</groupId> 
       <artifactId>Dummy-Project</artifactId> 
       <version>1.0-SNAPSHOT</version> 
       <packaging>jar</packaging> 

       <name>Dummy-Project</name> 
       <url>http://maven.apache.org</url> 

       <properties> 
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
       </properties> 

       <dependencies> 

        <dependency> 
         <groupId>junit</groupId> 
         <artifactId>junit</artifactId> 
         <version>3.8.2</version> 
         <scope>test</scope> 
        </dependency> 

        <dependency> 
         <grenter code here`oupId>org.apache.commons</groupId> 
         <artifactId>commons-dbcp2</artifactId> 
         <version>2.1</version> 
        </dependency> 

       </dependencies> 
       <build> 
        <plugins> 
         <plugin> 
          <groupId>org.codehaus.mojo</groupId> 
          <artifactId>exec-maven-plugin</artifactId> 
          <version>1.5.0</version> 
          <configuration> 
           <mainClass>list.Trial</mainClass> 
          </configuration> 
         </plugin> 
        </plugins> 
       </build> 
      </project> 

だから、私はまた、依存関係 ようコモンズ-dbcp2を追加しましたが、私は、端末上でこのコードを実行しようとすると、(私はマックで働く) 私は、次の例外エラーが出ます:

Oguz-Bayral:Dummy-Project OguzBayral$ java -cp target/Dummy-Project-1.0-SNAPSHOT.jar oguzbayral.trial.dummy.Apply 
       Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/dbcp2/BasicDataSource 
        at oguzbayral.trial.dummy.Apply.poolWay(Apply.java:19) 
        at oguzbayral.trial.dummy.Apply.getConnection(Apply.java:27) 
        at oguzbayral.trial.dummy.Apply.process(Apply.java:47) 
        at oguzbayral.trial.dummy.Apply.main(Apply.java:67) 
       Caused by: java.lang.ClassNotFoundException: org.apache.commons.dbcp2.BasicDataSource 
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
        at `enter code here`sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
        ... 4 more 

はそれではないです奇妙な、私はすでにそれらをインポートしましたか?問題は何ですか?どのように修正できますか?ありがとうございます。

+0

端末で実行するときは、プログラム自体のJARだけでなく、依存関係のすべてのJARをクラスパスに追加する必要があります。 – Jesper

+0

@Jesper私はそれを試したが、うまくいかなかった。私はクラスパスにJunit 3.8.1 jarを追加しました。他のjarファイルのバージョンが正確に一致していることを確信しました。今私は、junit 3.8.1、commons-pool2 2.4.2、commons-dbcp2 2.1.1とmaven依存関係の1.2のコモンログを持っています。また、derby.jar、derbyLocale_esjar、derbyclient.jarなどの他の.jarファイルもあります。もう一度おねがいします! – 88yomc

+0

明確にするには、 '-cp'オプションの引数としてコマンドラインにすべて追加する必要があります:' java -cp target/Dummy-Project-1.0-SNAPSHOT.jar:thislib.jar:thatlib.jar:anotherlib .jar ... ' – Jesper

答えて

0

クラスがクラスパスにないようです。クラスをインポートしても、ランタイムでクラスパスにそのクラスがあることは保証されません。

関連する問題