我将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兼容代码?
答案 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()
。
另请参阅:
答案 1 :(得分:1)
如果您想100%确定,请使用将在生产中使用的同一JDK进行编译,至少使用相同的主版本进行编译。 JRE 11可以肯定地执行1.8类文件。但是,较早的JVM可能无法运行较新的类文件。即使您以旧版本为目标并生成应兼容的类文件,也可能会针对较新的JDK类进行编译,并且API确实发生了变化。当您尝试在较早的JVM上运行代码时,这可能会破坏代码。
大多数情况下都可以使用,但是比后悔更安全!在这种情况下,请听警告,它们确实有重点。
编辑:有关--release选项,请参见howlger的答案。
答案 2 :(得分:0)
有没有您没有安装JDK的机会?如果我没有记错的话,警告与此有关。听起来像我的Eclipse,OpenJDK,Ubuntu组合缺少openjdk-11-jdk软件包。