我有同样的要求,我通过以下方式解决了它:
有一个“启动”类,它对任何新的JDK类或任何应用程序的类都没有依赖关系(= imports).你不要通过名字导入你的主类!
就像是:
在该入门类中,检查所需的Java版本.
如果检查成功,则使用反射加载主类并启动它的主方法(或您使用的任何方法).像这样的东西:
public class MyStarter
{
public static void main(String[] args)
{
String version = System.getProperty("java.version", null);
boolean isVersionOK = ... ;
if (!isVersionOK)
{
System.err.println("Wrong Java version detected");
// or display some messagebox using JOptionPane
System.exit(1);
}
Class mainClass = Class.forName("com.foo.MyMain");
Method main = mgr.getDeclaredMethod("main", new Class[] { String[].class });
main.invoke(null, new Object[] { args });
}
}
再次:确保MyStarter不包含任何导入到您的应用程序或Java 1.2中不可用的类(或您将要定位的任何Java版本).
然后用-source 1.2 -target 1.2编译MyStarter(并且只有那个类)
使用常规编译器编译其余类(例如,创建Java7 .class文件).
如果生成可执行jar,则将com.foo.MyStarter添加为Main-Class:属性.
我的Ant build.xml中的“compile”目标看起来像这样:
srcdir="${src}"
target="1.2"
source="1.2"
encoding="ISO-8859-1"
includeantruntime="false"
includes="com/foo/MyStarter.java"/>
srcdir="${src}"
target="1.6"
source="1.6"
includeantruntime="false"
encoding="ISO-8859-1">
....
然后将所有内容放入一个jar文件中.