0

JDBC を CLASSPATH に追加しないことは可能ですか? ソースコードを使用するだけです。

データベースに接続するプログラムを作成していますが、ユーザーに JDBC をクラスパスに追加するように依頼したくありません。JDBC をクラスパスに追加しないことは可能ですか?

4

3 に答える 3

2

いいえ、そうではありません。より正確には、実行時に JDBC jar を実行時のクラスパスに追加して、ユーザーには比較的見えないようにすることは可能かもしれませんが、関連するドライバーなしで JDBC を実行することはできません。

Java デスクトップ アプリを展開する場合、通常、最適なオプションはアプリをインストールすることです。Java Web Startを使用します。JWS は、Windows、OS X、および *nix で動作します。

これはあなたにとっては大変な作業ですが、エンド ユーザーにとっては簡単です。実行時のクラスパスや、その上にあるものとないものについて何も知る必要はありません。アプリを起動するための便利なデスクトップ ショートカットまたはメニュー項目を提供することもできます。

于 2013-05-18T03:09:43.603 に答える
1

はい、可能です。

実際には美しいアプローチではありません...

lib というフォルダーを使用し、そこに odbc jar i を置きます。「lib/jodbc.jar」のように、lib jar への相対パスを使用します。

jar を resource というフォルダーに埋め込むことができます。その後、アプリケーションを起動するたびにフォルダー lib/jodbc.jar を探します。存在しない場合は、フォルダーを作成し、アプリケーション内のリソース ファイルをフォルダーにコピーできます。そして完了。

私はいくつかのアプリケーションでこのアプローチを使用しており、これまでのところうまくいきました。ユーザーがクラスパスを追加するのが難しいという同じ問題があったため、アプリ内で「ポータブル」jreとlibsのみを使用します。

例を示していなくて申し訳ありませんが、私は今授業中です。

さらに例が必要な場合はお知らせください。月曜日に回答できます。

ちゃ。


まず、プロジェクトに lib を追加する必要があります。

NetBeans を使用している場合は、プロジェクト プロパティに移動し、lib に jar を追加しますが、最初に lib という名前のプロジェクト フォルダー内にフォルダーを .jar とともに配置し、次に jar を追加して相対パスを選択します。


リソースをコピーするには:

    //Create the /lib directory with the .jars and the service.exe
    //The resource_path is the package where are your files...
    String resource_path = "br/com/myservice/resources/";
    Util.copyResource(this.getClass().getClassLoader(), resource_path, "PAF_Service.exe", currentDirectory);

    resource_path = resource_path + "lib/";
    String directory_lib = currentDirectory + "lib/";

    File dir_lib = new File(directory_lib);
    if(!dir_lib.exists()){
        dir_lib.mkdir();
    }

    Util.copyResource(this.getClass().getClassLoader(), resource_path, "ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar", directory_lib);
    Util.copyResource(this.getClass().getClassLoader(), resource_path, "log4j-1.2.17.jar", directory_lib);
    Util.copyResource(this.getClass().getClassLoader(), resource_path, "WinRun4J.jar", directory_lib);

copyResource メソッド:

    public static boolean copyResource(ClassLoader classLoader, String resource_path, String resource, String destiny){
    FileOutputStream fos = null;
    Boolean retorno = false;
    try {
        InputStream is = classLoader.getResourceAsStream(resource_path + resource);

        if(is == null){
            System.out.println("Resource not found! >> " + resource_path + resource);
            retorno = false;
        }

        fos = new FileOutputStream( new File(destiny, resource));
        byte[] buffer = new byte[1024];
        int read = -1;
        while( (read = is.read(buffer)) != -1 ) {
            fos.write( buffer,0,read);
        }
        fos.flush();
        fos.close();
        retorno = true;
    } catch (FileNotFoundException ex) {
        Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        try {
            if(fos != null)
                fos.close();
        } catch (IOException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    return retorno;
}
于 2013-05-18T12:45:04.877 に答える
1

理論的には、独自の JDBC ドライバーを作成することは可能です。これを行った場合、JDBC ドライバーはコードベースの一部になり、アプリケーションの JAR に含まれる可能性がありますしかし、これは本当に悪い考えのように聞こえます...

コードとサードパーティのコードを 1 つの JAR ファイルに結合する「uber jar」を作成することもできます。ただし、落とし穴があります。一部のオープン ソース ライセンス (LGPL など) では、これを行うことができません。むしろ、ライセンスの対象となるコードが、エンド ユーザーがライブラリの 1 つのバージョンを別のバージョンに簡単に置き換えることができる形式で提供されることを要求できます。「uber jar」アプローチはこれを困難にします。

ただし、最善の方法は、アプリケーションを複数の JAR としてパッケージ化し、インストーラーが JAR を適切な場所に配置し、ラッパー スクリプトまたはカスタム ランチャーを使用して CLASSPATH が正しいことを確認することです。

または、@Andrew Thompson が推奨する WebStart を使用します。これには、更新を処理する簡単な方法を提供したり、ユーザーの JRE インストールが最新であることを確認したりするなど、他の利点もあります。

于 2013-05-18T04:53:43.813 に答える