大家好!
我正面临一个问题,因为我正在将我的应用程序从Java6迁移到Java8 for MacOS(和其他操作系统,但是使用windows / linux没有问题!)。
当我使用Java6时,我使用MacOS APP“App Bundler”来做这个包。
此工具引用包含所有包信息的plist文件,并提供添加选项“WorkingDirectory”和变量$ APP_PACKAGE的功能,以便在包内设置包的工作目录,如下所示:
<key>WorkingDirectory</key>
<string>$$APP_PACKAGE/Contents/Resources/Java</string>
不幸的是,这个选项“WorkingDirectory”与捆绑器appbundler不存在,后者提供对Java 6高级版本的支持。
所以我google了很多,发现了这个问题; Apple Issue
所以我通过ant任务将<option value="-Duser.dir=$APP_ROOT/Contents/Resources"/>
添加到我的plist文件中:
<key>JVMOptions</key>
<array>
<string>-Xdock:icon=Contents/Resources/${bundle.icon}</string>
<string>-Duser.dir=$APP_ROOT/Contents/Resources</string>
</array>
我也绑了这个:
<option value="-Duser.dir=$APP_ROOT/Contents/Java" />
<argument value="-Duser.dir=$APP_ROOT/Contents/Java"/>
没有成功: - (
我在Java应用程序的早期启动中添加了一个很大的“反复”(如here所述):
String os = System.getProperty("os.name").toLowerCase();
System.out.println("os:" +os);
if (os.indexOf( "mac" ) >= 0){
try {
System.setProperty("user.dir", new File(".").getCanonicalPath());
System.out.println("user dir:" +System.getProperty("user.dir"));
System.out.println(new File(".").toURI());
System.out.println("Working directory: "+(new File(".").getCanonicalPath()));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
但没有效果;当我从之前的Java应用程序创建文件时,它们被创建到像/Applications/MyApp.app/Content/Java
这样的应用程序工作目录中,但是当我创建文件/文件夹时,它知道它是在/Users/MyUserName
下创建的
我也遵循这个PATCH(我发布了一个问题)并编译了一个新的jar,但<string>-Duser.dir=$APP_PATH/Contents/Java</string>
没有完成这项工作,env变量不是用户系统创建和使用的!
这让我变得愚蠢......任何想法?问候!!
[EDIT1] 作为一种解决方法,因为它也很简单但是太糟糕了,我只是更改了所有相对路径(至少有一些!):
String path = new File(".").getCanonicalPath();
File myFile = new File(path+File.separator+"MyFile");
它的作用类似于设置工作目录变量但我必须更改我的很多代码而不是使用单个选项(在Linux和Windows上我没有这种类型的问题):-( 无论如何感谢Trejkaz对我的问题有所回答...... 对不起我的拼写错误和我糟糕的英语。
另一次,问候!!
[EDIT2] 所以我编辑了所有相关路径,但是我遇到了第二个问题:每个ProcessBuilder命令在捆绑启动时失败但是在点击jar时成功,所以我使用了“桌面“就像这样:
DesktopApi desktopApi = new DesktopApi();
desktopApi.open("path-to-my-jar"+File.Separator+"MyJar.jar");
我使用由'MightyPork 编码的here (问候 !!)的类'DesktopApi',因为有时会提供桌面命令由JRE失败......
所以我现在已经完成了这个fu *****包装!问候 !!