誰かが私を助けてくれることを願っています。私はSQLiteデータベースに接続する単純なアプリケーションに取り組んでいます。以下は私の接続コードです:
try {
Connection con = DriverManager.getConnection("jdbc:sqlite:myDB.sqlite");
PreparedStatement pstm = con.prepareStatement("insert into hell(username,pssword) " +
"values ('"+tfUname.getText()+"','"+tfUpass.getText()+"')");
pstm.close();
con.close();
JOptionPane.showMessageDialog(null,"Congrats, you have been registered succesfully");
RegisterWindow rw = new RegisterWindow();
rw.setVisible(false);
pack();
dispose();
} catch(SQLException ex) {
setTitle(ex.toString());
}
これは、データベースにユーザー名とパスワードをロードするための単なるウィンドウです。私が抱えている問題は、ボタンをクリックすると次の例外が表示されることです。
"Java.sql.SQLException: No suitable driver found for jdbc:sqlite:C\\LoginJava2\\myDB.sqlite"
(JavaでSQLiteデータベースに接続する方法の例を見つけました。見つけた例はうまくいきます)
このプログラムは、ウィンドウビルダー(Eclipse)で実行しています。私が見つけた例で使用しているのと同じドライバーを使用しています。別のドライバーを使用する必要があるかどうかわかりません。実際、私は別のドライバーで試しましたが、そのメッセージはまだ表示されます。
クラスパスに、sqliteクラスとドライバーを含むjarがありません。 sqlite-jdbc-3.7.2.jar のようなもの、または適切なバージョンが必要です。
Jarが確実に存在する場合は、接続を作成する前に次のコード行を追加してみてください。
Class.forName("org.sqlite.JDBC");
同じ問題が発生しました。私はmavenを使用して依存関係を追加しました:
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.15.1
</version>
</dependency>
それはコンパイルすることができ、私は得ました:
Jdbc:sqlite:xx.dbに適したドライバーが見つかりません
私はクラスパスをチェックしましたが、sqlite-jdbc-3.15.1.jarが存在することを確認しました。なんらかの理由で、クラスがロードされなかったと思います。理由はわかりません。だから私は追加しました
Class.forName( "org.sqlite.JDBC");
私のコードの始めに。動いた!
そして、上の行を削除します。それでも動作します!プロジェクトをクリーンアップして再ビルドしました。Class.forName()はもう必要ありません!!!まだ理由はわかりません。しかし、問題は解決されました。 Class.forName()は、必要なクラスがクラスパスにあるかどうかの診断に使用できると思います。
Class.forNameだけではありません。
以下の両方を実行した場合:-プロジェクトの下のlibフォルダーにsqlite jarライブラリーを追加し、プロジェクトビルドパスでそれを参照します。 -Class.forName( "org.sqlite.JDBC")ステートメントを追加しました。そして、「No Suit Driver」というエラーメッセージが表示されますが、データベースパスが原因である可能性があります。 Windowsを使用している場合:代わりに:
DriverManager.getConnection("D:\\db\\my-db.sqlite").
あなたは使うべきです:
DriverManager.getConnection("jdbc:sqlite:D:\\db\\my-db.sqlite").
「jdbc:sqlite:」がそのトリックを実行します。
Linuxを使用している場合は、区切り文字を変更するだけです:DriverManager.getConnection( "jdbc:sqlite:/your/somepath/my-db.sqlite")。
「Class.forName( "org.sqlite.JDBC");」という行JDBCクラスの静的ブロックをトリガーするJDBCのインスタンスを作成するため、機能します。
static {
try {
DriverManager.registerDriver(new JDBC());
}
catch (SQLException e) {
e.printStackTrace();
}
}
上記のClass.forname()を追加する代わりに、同じ効果があり、よりエレガントな次の行を直接使用する必要があります(JDBCのインスタンスを何も作成しないため)。
DriverManager.registerDriver(new JDBC());
Mavenを使用しており、実行可能なjarを作成したい場合は、sqlite jarのコンテンツを独自に作成したjarにインポートすることができます。
<plugins>
<!-- any other plugins -->
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<addClasspath>true</addClasspath>
<mainClass>MyPackage.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
他の回答で提案されているように、特定のクラスパスや暗黙の使用法を追加する必要はありません。
私は次のような単純なgradle構成を使用して同様の問題に直面していました
apply plugin: 'Java'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.Apache.commons', name: 'commons-lang3', version: '3.0'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.2.0'
compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.23.1'
}
jar {
manifest {
attributes 'Main-Class': 'rewards.simulator.MainSimulator'
}
}
私は後で、gradleビルドが外部依存関係を含まないjarを作成していることを発見しました。次の構成を使用して、結果のjarファイルにすべての依存ライブラリをソースファイルとともに含めて、fat-jarを作成します。
apply plugin: 'Java'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.Apache.commons', name: 'commons-lang3', version: '3.0'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.2.0'
compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.23.1'
}
jar {
manifest {
attributes 'Main-Class': 'rewards.simulator.MainSimulator'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}