1

同様の質問がいくつかあることは知っていますが、成功していません。私はおそらく非常に基本的な何かを見逃しています。アプリケーション jar ファイル内の ressources パッケージに html ファイルがあり、それらのパスを取得して読み取り、更新する必要があります。これが私のコードです:

URL url  = ClassLoader.class.getResource("/com/lamalva/ressources/test.html");
System.out.println(url);          
java.awt.Desktop.getDesktop().browse(java.net.URI.create(url.toString()));

NetBeans IDE からこのコードを実行すると、出力は次のようになります: file:/Users/Philippe/NetBeansProjects/Test/build/classes/com/lamalva/ressources/SatelliteQuotaMonitor.html 期待どおりにブラウザーで html ファイルが開かれますが、 OSX Terminal から jar ファイルを実行すると、出力は jar:file:/Users/Philippe/.Trash/Test/Test.jar!/com/lamalva/ressources/SatelliteQuotaMonitor.html になり、html ファイルが開かれません。何をしても、パスを正しく取得できません。私はいつも「Test.jar!」を持っています。途中で。大変助かります

4

5 に答える 5

2

一行の答えは -

文字列パス = this.getClass().getClassLoader().getResource().toExternalForm().

基本的に getResource メソッドは URL を提供します。この URL から、toExternalForm() を呼び出してパスを抽出できます。

参照: https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResource(java.lang.String) https://docs.oracle.com/javase/7/ docs/api/java/net/URL.html#toExternalForm()

于 2014-11-26T12:35:54.650 に答える
0

ClassLoaderjar 内のリソースが必要な場合は、いくつか使用する必要があります。このフラグメントは AppServer でも機能します。

この例では、パッケージsqlite-jdbc-3.7.2.jarにあるファイルから読み取ります。org.sqlite

public class Main {

private static InputStream getResourceAsStream(String resource) throws FileNotFoundException {
    String stripped = resource.startsWith("/") ? resource.substring(1) : resource;
    InputStream stream = null;
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    if (classLoader != null) {
        stream = classLoader.getResourceAsStream(stripped);
    }
    if (stream == null) {
        stream = MyClass.class.getResourceAsStream(resource);
    }
    if (stream == null) {
        stream = MyClass.class.getClassLoader().getResourceAsStream(stripped);
    }
    if (stream == null) {
        throw new FileNotFoundException("File not found: " + resource);
    }
    return stream;
}

public static void main(String[] args) throws FileNotFoundException {
    // Read file from JAR sqlite-jdbc-3.7.2.jar
    Scanner sc = new Scanner(getResourceAsStream("org/sqlite/NativeDB.c"));
    while(sc.hasNextLine()) {
        System.out.println(sc.nextLine());
    }
}

}

詳細については、Java クラスローダを参照してください。

コンテンツを更新したい場合は、Jar Inspectorが役立ちます。

于 2012-05-03T17:07:40.570 に答える
0

解凍サブプロトコルの URL は!、通常のブラウザでは使用できません。ssh:(端末アクセス) またはsmtp:/ mailto:(電子メール) のように。また、「file:..../my.jar!...」は、通常の URL の使用できない拡張子です。

HTML サポートが制限された JTextPane/JEditorPane があります。そして、いくつかの Java ブラウザ プロジェクト。

おそらく、Java Jetty Web サーバーの埋め込みが使用される可能性があります。

于 2012-05-03T17:08:22.353 に答える
0

デフォルトのプラットフォーム Web ブラウザーでクラスパスからリソースを開くには、2 つのオプションがあります。上記のリソースを抽出してファイル システムの一時的な場所にコピーし、file: url を渡します。別のおそらくより良いオプションは、組み込み Web サーバー (Jetty など) を実行し、クラスパスから直接リソースを提供することです。

于 2012-05-03T17:10:40.257 に答える
0

jar ファイル内のリソースを読み取って更新する必要がありますか?

入力ストリームからコンテンツを読み取ることができます。リソースがクラス ファイルと同じパッケージにある場合は、相対パスを使用します。

InputStream in = this.getClass().getResourceAsStream("/class/path/to/file");

書き込むには、おそらく既存の jar の内容を読み込み、必要な部分を変更してから、JarInputStream と JarOutputStream を使用して更新された内容を書き出す必要があります。

于 2012-05-03T17:07:08.167 に答える