结论:制作可执行JAR其实很简单,实际上也很简单,我一直都这么认为,但它今天却给我开一个玩笑,着实折腾了我一阵子,终于解决了,其实就是一个小小的细节问题:Main-Class: XXX,“:”后一定要有空格,XXX后要有回车;
起因:用VAINSTALL制作的发布程序,在HP-UX,SUN_SALORIS上没有问题,而在IBM-AIX却无法执行,因怀疑是JDK之执行java -jar存在bug(其实不是),于是决定做一个可执行JAR到IBM-AIX上进行测试,javac一个默认package的测试类应该在javac时很容易,所以,决定模拟带指定包名的测试类;
过程:
1、在指定目录下创建所需的一切信息,比如在d:/temp/test创建一个Test.java,代码如下:
package temp.test;
public class Test {
public static void main(String[] args) {
System.out.println(System.getProperty("java.version"));
}
}
2、编译上面的测试类
在WINDOW-DOS模式下,执行
3、验证2的操作是否达到预期目的
1.5.0_07
4、创建 MANIFEST.MF
在d:/目录下(任何一个位置都可以,前提是你能让程序找到它)创建一个名为 MANIFEST.MF的文件,其内容为:
5、打包产生可执行JAR
标明清单(manifest)
增加:temp/(读入= 0) (写出= 0)(存储了 0%)
增加:temp/test/(读入= 0) (写出= 0)(存储了 0%)
增加:temp/test/Test.class(读入= 492) (写出= 314)(压缩了 36%)
增加:temp/test/Test.java(读入= 144) (写出= 121)(压缩了 15%)
若4中Main-Class的“:”后没有“ ”空格,你将得到类似于下面的信息
java.io.IOException: invalid header field
at java.util.jar.Attributes.read(Attributes.java:393)
at java.util.jar.Manifest.read(Manifest.java:167)
at java.util.jar.Manifest.<init>(Manifest.java:52)
at sun.tools.jar.Main.run(Main.java:123)
at sun.tools.jar.Main.main(Main.java:903)
6、验证5操作是否达到预期目的
1.5.0_07
若在4中,没有加入“回车换行”,则会产生
Failed to load Main-Class manifest attribute from
test.jar
警惕:上面是测试样例的制作过程,在打包产生可执行JAR时需要注意两个问题:
Main-Class: XXX
“:”后一定要有空格,XXX是带包全名的入口主类,且后要有回车,当仅有Main-Class而无Class-Path时;
B.若需要指定依赖类或jar
Class-Path: lib/common.jar lib/dateUtils.jar
“:”后一定要有空格,多个jar之间用" "空格分割,之后别忘记加入回车换行哦~~
遗憾&求助:打jar的问题是解决了,且在AIX上可执行, 但在AIX安装发布程序却问题依旧,终报错为:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:44)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:39)
at java.lang.reflect.Constructor.newInstance(Constructor.java:516)
at IDEP.launchSetup(IDEP.java:293)
at IDEP.setup(IDEP.java:154)
at IDEP.main(IDEP.java:62)
Caused by: java.lang.NoClassDefFoundError: sun.awt.X11GraphicsEnvironment (initialization failure)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:140)
at java.lang.Class.forNameImpl(Native Method)
at java.lang.Class.forName(Class.java:136)
at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:68)
at sun.awt.X11.XToolkit.<clinit>(XToolkit.java:89)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
at java.lang.Class.forNameImpl(Native Method)
at java.lang.Class.forName(Class.java:136)
at java.awt.Toolkit$2.run(Toolkit.java:846)
at java.security.AccessController.doPrivileged(AccessController.java:202)
at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:838)
at sun.swing.SwingUtilities2$AATextInfo.getAATextInfo(SwingUtilities2.java:140)
at javax.swing.plaf.metal.MetalLookAndFeel.initComponentDefaults(MetalLookAndFeel.java:1557)
at javax.swing.plaf.basic.BasicLookAndFeel.getDefaults(BasicLookAndFeel.java:142)
at javax.swing.plaf.metal.MetalLookAndFeel.getDefaults(MetalLookAndFeel.java:1592)
at javax.swing.UIManager.setLookAndFeel(UIManager.java:542)
at javax.swing.UIManager.setLookAndFeel(UIManager.java:582)
at javax.swing.UIManager.initializeDefaultLAF(UIManager.java:1346)
at javax.swing.UIManager.initialize(UIManager.java:1435)
at javax.swing.UIManager.maybeInitialize(UIManager.java:1423)
at javax.swing.UIManager.getDefaults(UIManager.java:663)
at javax.swing.UIManager.put(UIManager.java:992)
at com.memoire.vainstall.VAGlobals.setLanguage(Unknown Source)
at com.memoire.vainstall.Setup.<init>(Unknown Source)
... 7 more
Caused by: java.lang.InternalError: Can't connect to X11 window server using '132.104.64.177:0.0' as the value of the DISPLAY variable.
at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
at sun.awt.X11GraphicsEnvironment.access$100(X11GraphicsEnvironment.java:52)
at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:155)
at java.security.AccessController.doPrivileged(AccessController.java:202)
at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:131)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
at java.lang.Class.forNameImpl(Native Method)
at java.lang.Class.forName(Class.java:136)
at sun.swing.SwingUtilities2.isLocalDisplay(SwingUtilities2.java:1407)
at javax.swing.plaf.metal.MetalLookAndFeel.initComponentDefaults(MetalLookAndFeel.java:1556)
... 18 more
查到可用的信息为:
http://www-01.ibm.com/support/docview.wss?uid=swg21321471
java.lang.NoClassDefFoundError: sun.awt.X11GraphicsEnvironment (initialization failure)
Technote (troubleshooting)
Problem
You try to run a Java agent on a Lotus? Domino? for IBM? i (i5/OS?) server. It is failing with the following error message:
"java.lang.NoClassDefFoundError: sun.awt.X11GraphicsEnvironment (initialization failure)"
The agent works when run on Microsoft? Windows?.
Environment
IBM i V5R4
Resolving the problem
IBM i requires that you edit or add the following line to the SystemDefault.properties file.
java.awt.headless=true
但问题依旧未解决,处理中~~