2016-03-22 12 views
0

PostgreSQLデータベースに接続して、特定の命名パターンでデータベースがあるかどうかを調べる非常に簡単なJavaプログラムがあります。私がそれらを見つけると、私はそれらをJava JDBCコードを通して削除しようとしています。 Javaコードは、手動で実行するとうまく動作しますが、達成しようとしているのは、このJava呼び出しをバッチファイルで自動化することです。バッチファイルからJavaプログラムを呼び出すときに助けが必要

誰もがこれにどのような光を投げることができますか?私はこれのための解決策を見つけるのに苦労していることが、不満を募っていました。

私のJavaコード:

public class CreateBatchToCleanNamedDBs { 
    public static void main(String[] args) { 
     Connection connection = null; 
     BufferedReader input = null; 
     try { 
      String line; 
      RandomAccessFile batchFile = new RandomAccessFile("C:/batch.sql", "rw"); 
      Class.forName("org.postgresql.Driver"); 
      connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "Welcome12!"); 
      Statement stmt = connection.createStatement(); 
      ResultSet rs = stmt.executeQuery("select datname from pg_database where datname like 'sample_db%';"); 

      while (rs.next()) { 
       batchFile.writeBytes("DROP DATABASE " + rs.getString("datname") + ";\n"); 
       System.out.println(rs.getString("datname")); 
      } 

      Process batchProcess = Runtime.getRuntime().exec("C:/Program Files/PostgreSQL/9.5/bin/psql -h localhost -U postgres -f C:/batch.sql"); 
      input = new BufferedReader(new InputStreamReader(batchProcess.getInputStream())); 
      if(batchFile.length()!= 0) { 
       while ((line = input.readLine()) != null) { 
        System.out.println(line); 
       } 
      } 
      batchFile.close(); 
     } catch(Exception exception) { 
      System.out.println("Exception caught: " + exception); 
      exception.printStackTrace(); 
     } finally { 
      try { 
       connection.close(); 
      } catch (SQLException sqlexception) { 
       sqlexception.printStackTrace(); 
      } 
     } 
    } 
} 

私のバッチファイルのスクリプト:

@echo off 
setlocal 

if not defined JAVA_HOME goto :NoJavaFound 

"%JAVA_HOME%\bin\java.exe" -jar "%~dp0\deletedb.jar;%~dp0\postgresql-9.4.1207.jar;" connect.postgresql.CreateBatchToCleanNamedDBs 
goto :end 

:NoJavaFound 
echo JAVA_HOME environment variable is not set. 
goto :end 

:end 
endlocal 

私はjarファイル(私のJavaコード、上に示した)と、デスクトップ上のバッチスクリプトファイル(両方を持っています同じフォルダ)を実行しようとしていますが、NullPointerExceptionがあります。私のJavaコードにはPostgreSQL jdbcドライバがありません。私はそれを複数の方法でパラメータとして追加しようとしましたが、何も動作しません。

エラーの詳細:

C:\Users\pavan>C:\Users\pbonda\Desktop\deletedb.bat 
Exception caught: java.lang.ClassNotFoundException: org.postgresql.Driver 
java.lang.ClassNotFoundException: org.postgresql.Driver 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:264) 
     at connect.postgresql.CreateBatchToCleanNamedDBs.main(CreateBatchToCleanNamedDBs.java:20) 
Exception in thread "main" java.lang.NullPointerException 
     at connect.postgresql.CreateBatchToCleanNamedDBs.main(CreateBatchToCleanNamedDBs.java:45) 

答えて

1

で試してみてください。

"%JAVA_HOME%\bin\java.exe" -cp "%~dp0\postgresql-9.4.1207.jar;%~dp0\deletedb.jar" connect.postgresql.CreateBatchToCleanNamedDBs 
+0

感謝を参照してください、私は今、次のエラーを取得する: 'エラー:jarファイルをCにアクセスすることができません:\ Users \ユーザーpavan \デスクトップ\\ deletedb.jar;' –

+0

@BPavanKumarは - してみてください今.. – npocmaka

+0

ありがとう@npocmaka、それは働いた! :) –

3

実行可能なjarファイルを使用してJavaを呼び出す場合、javaコマンドに提供するクラスパスは無視されます。

あなたがすべきです:

  • は、明示的にそのMANIFEST.MFファイルだけでなく、そのメインクラスにjarファイルのクラスパスの依存関係を指定
  • (すなわち"%JAVA_HOME%\bin\java.exe" -cp "%~dp0\deletedb.jar;%~dp0\postgresql-9.4.1207.jar;" connect.postgresql.CreateBatchToCleanNamedDBs)クラスパスにjarファイルを、ターゲットクラスを呼び出します; jaをjava -jarで実行することができます。これを参照してくださいOracle doc
  • postgresql jarを現在のjreのエクステンションライブラリディレクトリまたはグローバルエクステンションライブラリディレクトリに追加してください。あなたの答えのために、このOracle docDeprecated in JavaSE 8, dropped in JavaSE9
+0

アーロン、あなたが言及した最初のオプションはまさに私が今やっていることです。 2番目のものが動作するためには、どのように追加する必要がありますか?つまり、manifest.mfファイルにどのようなjarファイルが追加されようとしていますか? –

+1

@BPavanKumarこれはあなたが現在行っていることを確信していますか?もしそうなら、 '-cp'を使うべきところで、' -jar'を使って、バッチファイルを編集しなければなりません。 2番目のソリューションでは、いくつかのドキュメントへのリンクを掲載しますが、最初のものがあなたのニーズに適していると確信しています。ああ、私はちょうど良い選択肢かもしれない第三の解決策を考えました、私はそれも追加します。 – Aaron

+0

そこには、他のことは考えられません。私は柔軟性のためにdevの第3のソリューションを推奨し、それが実行される環境をどのくらい制御するかに応じて、最初の2つは生産のためのものです。 – Aaron

関連する問題