为什么Eclipse抱怨项目指定了编译器遵从性1.8,但使用了JRE 11?

时间:2019-03-16 07:33:14

标签: java eclipse compiler-version

我将Eclipse项目编译器的兼容性设置为1.8,因为我想生成可以在安装JRE 8的计算机中执行的jar文件。

但是,在开发计算机中,我仅安装了JRE 11。我以为这没问题,因为我希望JRE 11能够执行1.8个及以上版本的文件。

但是,Eclipse会对此发出警告(我找不到禁用的方法),并且编译器首选项对话框显示“选择1.8兼容性时,请确保安装并激活了兼容的JRE(当前为11)”,这听起来像JRE 11与1.8不兼容。是真的吗?

确切地说,我在这里做了什么错误的假设?

还,我是否真的需要安装JRE 8才能生成JRE 8兼容代码?

3 个答案:

答案 0 :(得分:2)

项目>属性:Java编译器 中,选中 使用'--release'选项 复选框,以避免警告。

使用使用'--release'选项,并且将编译器遵从性级别设置为 1.8 ,例如,import React, { useState } from "react"; import { withRouter } from "react-router-dom"; import _ from "lodash"; import InputControl from "./InputControl"; import InputButton from "./InputButton"; import FormControl from "./FormControl"; const LoginCard = props => { const [hideContent, setHideContent] = useState(false); const [emailSignUpRef, setEmailSignUpRef] = useState(""); const [firstNameSignUpRef, setFirstNameSignUpRef] = useState(""); const [surnameSignUpRef, setsurnameSignUpRef] = useState(""); const [passwordSignUpRef, setPasswordSignUpRef] = useState(""); const [confirmPasswordSignUpRef, setConfirmPasswordSignUpRef] = useState(""); let registerEmailInput = ""; let firstNameInput = ""; let surNameInput = ""; let passwordInput = ""; let confirmPasswordInput = ""; let checkBoxSignUp = ""; let signUpBtn = ""; const scrollToEl = _.debounce( el => window.scrollTo({ top: el, behavior: "smooth" }), 1000 ); const handleOnFocus = event => { scrollToEl(event.target); setEmailSignUpRef(registerEmailInput.value); setFirstNameSignUpRef(firstNameInput.value); setsurnameSignUpRef(surNameInput.value); setPasswordSignUpRef(passwordInput.value); setConfirmPasswordSignUpRef(confirmPasswordInput.value); setHideContent(true); }; const handleOnInput = () => { setEmailSignUpRef(registerEmailInput.value); setFirstNameSignUpRef(firstNameInput.value); setsurnameSignUpRef(surNameInput.value); setPasswordSignUpRef(passwordInput.value); setConfirmPasswordSignUpRef(confirmPasswordInput.value); }; const handleOnBlur = event => { const rl = event.relatedTarget; if ( !(firstNameInput === rl) && !(surNameInput === rl) && !(passwordInput === rl) && !(confirmPasswordInput === rl) && !(registerEmailInput === rl) && !(checkBoxSignUp === rl) && !(signUpBtn === rl) ) { setHideContent( !_.isEmpty(emailSignUpRef.trim()) || !_.isEmpty(firstNameSignUpRef.trim()) || !_.isEmpty(surnameSignUpRef.trim()) || !_.isEmpty(passwordSignUpRef.trim()) || !_.isEmpty(confirmPasswordSignUpRef.trim()) ); } }; const loginForm = ( <FormControl key={props.active}> <InputControl autoComplete="off" type="text" name="emailAddress" placeholder="Email address" label="Email Address" /> <InputControl autoComplete="off" type="password" name="password" placeholder="Password" label="Password" /> <InputControl type="checkbox" name="email" label="Keep me logged in" /> <InputButton buttonText="Login" type="submit" /> </FormControl> ); const registerForm = ( <FormControl key={props.active}> <InputControl refProp={input => { registerEmailInput = input; }} onInput={handleOnInput} onFocus={handleOnFocus} onBlur={handleOnBlur} value={emailSignUpRef} autoComplete="off" type="text" name="emailAddressRegister" placeholder="Email address" label="Email Address" /> <InputControl className={ !hideContent ? "InputControl--hidden" : "InputControl--visible" } autoComplete="off" refProp={input => { firstNameInput = input; }} onInput={handleOnInput} onBlur={handleOnBlur} type="text" name="firstName" placeholder="First Name" label="First Name" /> <InputControl className={ !hideContent ? "InputControl--hidden" : "InputControl--visible" } autoComplete="off" refProp={input => { surNameInput = input; }} onInput={handleOnInput} onBlur={handleOnBlur} type="text" name="surName" placeholder="Surname" label="Surname" /> <InputControl className={ !hideContent ? "InputControl--hidden" : "InputControl--visible" } autoComplete="new-password" refProp={input => { passwordInput = input; }} onInput={handleOnInput} onBlur={handleOnBlur} type="password" name="passwordRegister" placeholder="Password" label="Password" /> <InputControl refProp={input => { checkBoxSignUp = input; }} type="checkbox" name="checkboxRegister" label={["I have read and agreed to the terms and conditions"]} /> <InputButton refProp={input => { signUpBtn = input; }} buttonText="Sign Up" type="submit" /> </FormControl> ); return ( <div className="LoginCard"> <h2 className={ "LoginCard-title" + (hideContent ? " LoginCard-titleHidden" : "") } > {props.active === "login" ? "Login" : "Sign Up"} </h2> {props.active === "login" ? loginForm : registerForm} </div> ); }; export default withRouter(LoginCard); 甚至在Java中也显示为错误。 11 JDK,因为Java 11中缺少在Java 11中引入的String#strip()

enter image description here

另请参阅:

答案 1 :(得分:1)

如果您想100%确定,请使用将在生产中使用的同一JDK进行编译,至少使用相同的主版本进行编译。 JRE 11可以肯定地执行1.8类文件。但是,较早的JVM可能无法运行较新的类文件。即使您以旧版本为目标并生成应兼容的类文件,也可能会针对较新的JDK类进行编译,并且API确实发生了变化。当您尝试在较早的JVM上运行代码时,这可能会破坏代码。

大多数情况下都可以使用,但是比后悔更安全!在这种情况下,请听警告,它们确实有重点。

编辑:有关--release选项,请参见howlger的答案。

答案 2 :(得分:0)

有没有您没有安装JDK的机会?如果我没有记错的话,警告与此有关。听起来像我的Eclipse,OpenJDK,Ubuntu组合缺少openjdk-11-jdk软件包。