2013-11-25 27 views
2

我在小牛队在JavaFX应用程序创建的应用程序,并使用在Xcode 5.0.2签约 -如何在签署应用程序时保留别名属性?

codesign --deep -s "my name" MayApp.app 
codesign -v MayApp.app && echo MayApp.app is Signed Successfully! 

无符号MYAPP下水FINE!

没有使用- 深,我不能在小牛签署应用程序。

- 更多的尝试 -

现在在小牛队,我们不能再签订捆绑如果包中的任何嵌套包是无符号。我没有按照在书面指令签名我的应用程序的框架 - 单独或签署框架后,不使签名的应用程序的任何变化http://furbo.org/2013/10/17/code-signing-and-mavericks/

codesign --verbose --force --sign "my name" MyApp.app/Contents/PlugIns/jdk1.7.0_21.jdk 

签署框架命令。

------主要问题------

以上命令的运行(只是否签署应用或连同框架签字),MyApp.app获得成功签约但应用程序无法在Mac上启动,因为签署的命令不保留ALIAS属性,该文件存在于 - MyApp.app/Contents/PlugIns/jdk1.7.0_21.jdk/Contents/MacOS处的文件libjli.dylib。签署应用程序代码将libjli.dylib别名转换为动态库。

后来我想通过以下命令复制libjli.dylib的 -

<target name="Copylib" depends="SigningApp"> 
<delete file="MyApp.app/Contents/PlugIns/jdk1.7.0_21.jdk/Contents/MacOS/libjli.dylib"/> 
<exec executable="cp"> 
    <arg line="-R /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/MacOS/ MyApp.app/Contents/PlugIns/jdk1.7.0_21.jdk/Contents/MacOS"/> 
</exec> 
</target> 

该保留的别名,但现在对验证标志应用说 -

admins-iMac:osx admin$ codesign -v -v MyApp.app 
MyApp.app: code object is not signed at all 
In subcomponent: MyApp.app/Contents/PlugIns/jdk1.7.0_21.jdk 
In architecture: x86_64 

同样发生,如果我是复制在MyApp.app手动别名。

请建议任何方式来保存我的框架中存在的所有文件的属性 - Contents/PlugIns/jdk1.7.0_21.jdk

感谢

回答

3

我的问题得到通过,因为Oracle的Java版本7u25及以下已经被苹果在OS X更新到最新版本被禁用将允许Java要在Mac上运行从jdk7u21更新Java来最新jdk7u45解决OS X.

此外,我对这些改变是为了让应用有效的签署 -

  1. MyApp.app/Contents/Info.plist CFBundleExecutable给MyApp,CFBundleIconFile给MyApp.icns。
  2. 需要/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/MacOS/libjli.dylib复制到MyApp.app/Contents/PlugIns/jdk1.7.0_45。jdk/Contents/MacOS for libjli.dylib别名。
  3. 我们还需要从系统安装JDK复制/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Info.plist我们MyApp.app/Contents/PlugIns/jdk1.7.0_45.jdk /内容/

注:步骤2和3是必需的,因为上部署了JavaFx的应用程序,默认情况下只复制/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/HomeMyApp.app/Contents/PlugIns部署过程中,它是跳跃的MacOS /文件夹和Info.plist。

没有做这些上述变化与签署应用程序 -

codesign --deep -s "my name" MayApp.app 

,我正在签署越来越erron - MyApp.app:包格式无法识别的,无效的,或不适合 - 我们都面临这个问题,所以我们需要确定是什么使应用程序包格式无法识别,无效或不适用。

感谢

+0

我不知道这个解决方案是否适用于我的情况下试图签署山狮下的Java应用程序。它一直说,'代码已经签名',但是当选中它说无效的签名属性.. :(我会报告这里的结果升级JDK – swdev

+0

@swdev请让我知道你的山xcode和java版本是什么升级之前的Lion OS X? –

+0

感谢Neelam的回答,解决方案非常简单,我只是使用'codesign -f -s“Eko Wibowo”'强制签名,确认软件包是否签名。实际上,我没有签名,但是使用'-f'选项解决了问题! – swdev

0

我仍然得到一个错误应用解决方法后建议。一旦出现符号链接,应用验证就不会通过。使用spctl -a -v MyApp.app命令行来验证捆绑。

我深入挖掘并发现GetJREPath方法依赖libjli.dylib文件位置。一旦它被移入Contents/MacOS /文件夹,一切都会中断。我对GetJREPath方法做了一些改动,并从源代码重建了JDK。下面是一个文件的区别,将其应用到您的构建:

diff -r ff67c8965852 src/macosx/bin/java_md_macosx.c 
--- a/src/macosx/bin/java_md_macosx.c Wed Dec 11 11:19:00 2013 -0800 
+++ b/src/macosx/bin/java_md_macosx.c Wed Dec 18 17:33:29 2013 +0400 
@@ -640,7 +640,7 @@ 
     return JNI_FALSE; 
    } 

- const char lastPathComponent[] = "/lib/jli/libjli.dylib"; 
+ const char lastPathComponent[] = "/Contents/MacOS/libjli.dylib"; 
    size_t sizeOfLastPathComponent = sizeof(lastPathComponent) - 1; 
    if (pathLen < sizeOfLastPathComponent) { 
     return JNI_FALSE; 
@@ -648,7 +648,11 @@ 

    size_t indexOfLastPathComponent = pathLen - sizeOfLastPathComponent; 
    if (0 == strncmp(realPathToSelf + indexOfLastPathComponent, lastPathComponent, sizeOfLastPathComponent - 1)) { 
-  realPathToSelf[indexOfLastPathComponent + 1] = '\0'; 
+  realPathToSelf[indexOfLastPathComponent + 10] = 'H'; 
+  realPathToSelf[indexOfLastPathComponent + 11] = 'o'; 
+  realPathToSelf[indexOfLastPathComponent + 12] = 'm'; 
+  realPathToSelf[indexOfLastPathComponent + 13] = 'e'; 
+  realPathToSelf[indexOfLastPathComponent + 14] = '\0'; 
     return JNI_TRUE; 
    } 

这里正在建设和包装说明书OpenJDK7:https://github.com/hgomez/obuildfactory/wiki/Building-and-Packaging-OpenJDK7-for-OSX

我填一个错误甲骨文为好。希望这可以帮助。