2016-11-30 3 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(); 
     } 
    } 

}     

Итак, я могу получить вывод «Джеймс» на консоли. Также у меня есть необходимые файлы .jar. Я уже ввезли котелок, derbyclient, Обще-dbcp2 (версия 2.1.1), Commons Logging (версия 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 вашей программы. – Jesper

+0

@Jesper Я пробовал, но это не сработало. Я добавил банку Junit 3.8.1 в мой путь к классам, и я убедился в том, что версии других файлов jar точно совпадают. Теперь у меня есть junit 3.8.1, commons-pool2 2.4.2, commons-dbcp2 2.1.1 и commons, регистрирующий 1.2 в зависимостях maven, и я тоже их в ссылках. Также у меня есть некоторые другие .jar-файлы в них, такие как derby.jar, derbyLocale_esjar или derbyclient.jar и т. Д. Еще раз спасибо! – 88yomc

+0

Чтобы быть ясным: вы должны добавить их все в командной строке в качестве аргументов для опции '-cp':' java -cp target/Dummy-Project-1.0-SNAPSHOT.jar: thislib.jar: thatlib.jar: anotherlib .jar ... ' – Jesper

ответ

0

Кажется, что класса нет в вашем пути к классу. Импорт класса не гарантирует, что у вас будет этот класс в вашем пути к классам в Runtime.

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