1

これは、これに対するフォローアップの質問です簡単な説明と同じように、.jarOS XとWindowsではファイルをダブルクリックしてJavaプログラムを実行できましたが、Linuxでは実行できませんでした。後者の場合と同様です。ファイルパスの問題)。

Ubuntu(12.04)でNetBeansを使用していくつかのことを試してみたところ、問題はプログラムが作業ディレクトリと見なす場所にあるように思われることがわかりました(の出力から結論付けましたFile.getAbsolutePath())。NetBeansでアプリケーションを起動すると、すべてが機能し(Ubuntuでも)、

System.out.println(new File(".").getAbsolutePath());

を与えてくれます/home/my_home/projects/VocabTrainer/.。これは私のプロジェクトフォルダであり、正しいです。.jarただし、にあるファイルをダブルクリックすると/home/my_home/projects/VocabTrainer/dist、Ubuntuで突然出力されるのは単に/home/my_home/.です。dirのサブディレクトリにあるデータファイルにアクセスしたいので、これは問題がありますdist

この動作の原因と、問題を解決する方法を知っている人はいますか?

PS:これが必要かどうかはわかりませんが、次の出力がありますjava -version

java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)
OpenJDK Server VM (build 20.0-b12, mixed mode)
4

2 に答える 2

2

JARの場所を現在の作業ディレクトリと混同していると思います。

前者を判別するには、実行中のJARファイルのパスを取得する方法を参照してください。

于 2012-11-21T22:11:39.070 に答える
1

現時点では、原因は実際にはそうではありません。しかし、明らかに予測不可能なため、そのように処理したくない場合があります。getResource以下の呼び出しでjar内の何かの修飾されたクラス名を使用すると仮定すると、このようなものがファイルを取得するはずです。

URL url = this.getClass().getClassLoader().getResource("thepackage/ofyourclass/JunkTest.class");  //get url of class file.  expected: ("jar:file:/somepath/dist/yourjar.jar!qualified/class/name.class")
File distDir = null;
if(url.getProtocol() == "jar") {
    String classPath = null;
    String jarPath = url.getPath();
    if(jarPath.matches(".*:.*")) jarPath = new URL(jarPath).getPath();
    classPath = jarPath.split("!")[0];
    distDir = new File(classPath).getParentFile(); //may need to replace / with \ on windows?
} else { //"file" or none
    distDir = new File(url.toURI()).getParentFile();
}    
//... do what you need to do with distDir to tack on your subdirectory and file name

編集:これは明らかにハッキーであることを指摘する必要があります。起動時にファイルの場所をクラスパスに直接追加できる場合があります(または、探しているファイルをjarに含めます)。これから、this.getClass().getClassLoader().getResource()探しているもののファイル名を直接使用できます。これにより、次のようなものになります。

URL url = this.getClass().getResource("yourfile");
File file = new File(url.toURI());
//... use file directly from here

さらに編集:わかりました。不足しているプロトコルに適合し、それを広げて、エラーメッセージが読みやすくなるようにします。

于 2012-11-21T22:29:54.273 に答える