これは、「user.dir」はJVMの実行時に現在有効なユーザーディレクトリを示しているからです。 Windowsでは、特に指定しない限り、これはJARの場所です。 OSXでは、現在のディレクトリの概念がないかもしれませんが、おそらくそれは単に異なるデフォルトを持つ可能性があります。
私は特にOSXの下にこのコードをテストしたことがないけれども、あなたはどのクラスがロードされたディレクトリを検索し、これを試すことができます。
static public File getClassLocation(Class cls, boolean trmjar) {
ClassLoader clsldr; // class loader
URL urlobj; // url object
String exturl; // external form of URL
String lwrurl; // lowercase external form of URL
File rtnfil; // return file
if((clsldr=cls.getClassLoader())==null) { clsldr=ClassLoader.getSystemClassLoader(); }
if((urlobj=clsldr.getResource(cls.getName().replace('.','/')+".class"))==null) {
return null;
}
exturl=urlobj.toExternalForm();
lwrurl=exturl.toLowerCase();
while(lwrurl.startsWith("jar:") || lwrurl.startsWith("file:/")) {
if(lwrurl.startsWith("jar:")) {
if(lwrurl.indexOf("!/")!=-1) { exturl=exturl.substring(4,(exturl.indexOf("!/"))); } // strip encapsulating "jar:" and "!/..." from JAR url
else { exturl=exturl.substring(4 ); } // strip encapsulating "jar:"
}
if(lwrurl.startsWith("file:/")) {
exturl=exturl.substring(6); // strip encapsulating "file:/"
if(!exturl.startsWith("/")) { exturl=("/"+exturl); }
while(exturl.length()>1 && exturl.charAt(1)=='/') { exturl=exturl.substring(1); }
}
lwrurl=exturl.toLowerCase();
}
exturl=java.net.URLDecoder.decode(exturl,"UTF-8");
rtnfil=new File(exturl);
if(lwrurl.endsWith(".class") || (trmjar && lwrurl.endsWith(".jar"))) { rtnfil=rtnfil.getParentFile(); }
if(rtnfil.exists()) { rtnfil=rtnfil.getAbsoluteFile(); }
return rtnfil;
}
それは、すべてのバージョンのWindowsで年間の私のために確実に働いています
JarファイルはAppバンドル内にありますか(つまり* .appフォルダ)?アプリケーションアイコンをクリックしてjarを実行していますか? OS Xは、Jar Launcherプログラムでjarファイルを読み込みます。これは親作業ディレクトリを難読化する可能性があります。 –