Java 使用与Eclipse中其他类不同的编译器遵从性版本编译类
我一直在尝试编译我的项目中的一个特定类,其编译器遵从性级别高于项目的其他部分,但我不知道如何做到这一点 我正在用Java 6编译这个项目(出于兼容性原因),有一个类需要Java 8,并且只有当它运行的Java版本>=8时才会在代码中实例化(带有反射) 问题是Java 8中的类显然不是用Java 6编译的,所以我想问一下,当项目导出到可运行的Jar时,Eclipse中是否有办法用Java 8编译这个类 总是可以选择使用Java6编译项目(不使用Java8类),导出,然后使用Java8手动编译该类,然后手动插入Jar文件,这很好,但不是很方便 例如,假设项目由以下部分组成: 通用接口:Java 使用与Eclipse中其他类不同的编译器遵从性版本编译类,java,eclipse,Java,Eclipse,我一直在尝试编译我的项目中的一个特定类,其编译器遵从性级别高于项目的其他部分,但我不知道如何做到这一点 我正在用Java 6编译这个项目(出于兼容性原因),有一个类需要Java 8,并且只有当它运行的Java版本>=8时才会在代码中实例化(带有反射) 问题是Java 8中的类显然不是用Java 6编译的,所以我想问一下,当项目导出到可运行的Jar时,Eclipse中是否有办法用Java 8编译这个类 总是可以选择使用Java6编译项目(不使用Java8类),导出,然后使用Java8手动编译该类,
public interface CommonInterface {
public void foo();
}
Java 8类:
public class Java8Class implements CommonInterface {
@Override
public void foo() {
Arrays.asList("Some", "Java", "8", "code").forEach(System.out::println);
}
}
Java 6+类:
public class Java6PlusClass implements CommonInterface {
@Override
public void foo() {
List<String> list = Arrays.asList("Some", "Java", "6", "code");
for (String s : list) {
System.out.println(s);
}
}
}
在上面的示例中,是否可以配置Eclipse,使除“Java8Class”之外的所有类都使用Java6兼容编译,“Java8Class”使用Java8兼容编译
谢谢。在Eclipse中您无法做到这一点,我不相信您试图实现的是一个好主意 以下是您可以做的:
我不完全确定在使用Java6JRE执行程序的情况下,第二个选项是否可以简单地将jar文件放入类路径中。如果类加载器启动失败,您可能必须进行一些类加载器技巧。为什么不在8中编译所有内容?因为一些计划在上使用它的计算机还不支持Java 8,它们超出了我的控制范围,因此我无法在它们上更新Java。这在@azurefrog上不起作用,因为Java 8类使用Java 8特定的代码,可能无法编译为Java 6。抱歉,响应太晚。好主意还是坏主意,它提供了兼容性,这正是我感兴趣的:(我想知道eclipse是否能够通过内置功能或插件编译具有不同合规性级别的某些类。由于这不可能,我猜我将编译不同的版本并手动合并它们,尽管这很快就会变得混乱:(无论如何,感谢您的回复!
public class Selector {
public static void main(String[] args) throws ReflectiveOperationException{
CommonInterface ci = getCorrectInstance();
ci.foo();
}
private static CommonInterface getCorrectInstance() throws ReflectiveOperationException {
String version = System.getProperty("java.version");
Matcher m = Pattern.compile("\\d\\.(\\d)\\..+").matcher(version);
String clazz = null;
if (m.find()) {
int jv = Integer.parseInt(m.group(1));
if (jv == 8)
clazz = "Java8Class";
else if (jv >= 6)
clazz = "Java6PlusClass";
}
if (clazz == null)
return null;
return (CommonInterface) Class.forName(clazz).newInstance();
}
}