Java 使用与Eclipse中其他类不同的编译器遵从性版本编译类

Java 使用与Eclipse中其他类不同的编译器遵从性版本编译类,java,eclipse,Java,Eclipse,我一直在尝试编译我的项目中的一个特定类,其编译器遵从性级别高于项目的其他部分,但我不知道如何做到这一点 我正在用Java 6编译这个项目(出于兼容性原因),有一个类需要Java 8,并且只有当它运行的Java版本>=8时才会在代码中实例化(带有反射) 问题是Java 8中的类显然不是用Java 6编译的,所以我想问一下,当项目导出到可运行的Jar时,Eclipse中是否有办法用Java 8编译这个类 总是可以选择使用Java6编译项目(不使用Java8类),导出,然后使用Java8手动编译该类,

我一直在尝试编译我的项目中的一个特定类,其编译器遵从性级别高于项目的其他部分,但我不知道如何做到这一点

我正在用Java 6编译这个项目(出于兼容性原因),有一个类需要Java 8,并且只有当它运行的Java版本>=8时才会在代码中实例化(带有反射)

问题是Java 8中的类显然不是用Java 6编译的,所以我想问一下,当项目导出到可运行的Jar时,Eclipse中是否有办法用Java 8编译这个类

总是可以选择使用Java6编译项目(不使用Java8类),导出,然后使用Java8手动编译该类,然后手动插入Jar文件,这很好,但不是很方便

例如,假设项目由以下部分组成:

通用接口:

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中您无法做到这一点,我不相信您试图实现的是一个好主意

以下是您可以做的:

  • 将这个Java8类的代码更改为Java6中的等效代码(如果可能的话)
  • 使用这个类创建一个新项目,并使用Java8遵从性级别编译它。在启动应用程序时,在命令行中指定这个新的jar文件,它应该可以做到这一点
  • 拥有两个不同版本的应用程序(一个兼容Java 8,另一个兼容Java 6),并根据系统上可用的Java版本启动正确的应用程序

  • 我不完全确定在使用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();
        }
    
    }