OpenJDK 是JDK的開放源碼版本。
在服務器上更新了新的 jdk,也在 /etc/profile 中設置了新的 JAVA_HOME,并且 source /etc/profile
然后使用java -version 和 javac -version 發現版本還是老版本,死活沒有使用我新指定的。
中間各種排查,這里就不廢話了,下面是文件的根源和解決方法:
使用which java 和 which javac 分別可以看到
[root@localhost ~]# which java
/usr/bin/java
[root@localhost ~]# which javac
/usr/bin/javac
簡單說一下,就是把這2個文件ln -s 到我們新的jdk 下的 java 和 javac 上,命令如下:
rm -rf /usr/bin/java
rm -rf /usr/bin/javac
ln -s $JAVA_HOME/bin/javac /usr/bin/javac
ln -s $JAVA_HOME/bin/java /usr/bin/java
## Java 版本號
安裝文件: jdk-8u131-windows-x64.exe
安裝后的版本顯示:
```
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
```
## Java 版本歷史
* SE 標準
* LTS 長期支持
* JDK Beta - 1995
* JDK 1.0 - 1996年1月
* JDK 1.1 - 1997年2月
* J2SE 1.2 - 1998年12月
* J2SE 1.3 - 2000年5月
* J2SE 1.4 - 2002年2月
* J2SE 5.0 - 2004年9月
* Java SE 6 - 2006年12月
* Java SE 7 - 2011年7月
* Java SE 8(LTS) - 2014年3月
* Java SE 9 - 2017年9月
* Java SE 10(18.3) - 2018年3月
* Java SE 11(18.9 LTS) - 2018年9月
* Java SE 12(19.3) - 2019年3月
Oracle 發布計劃, 自Java SE 10以來,每6個月發布一次新版本。長期支持(LTS)版本的產品每3年發布一次。
OpenJDK是Java SE Platform Edition的免費開源實現。它最初于2007年發布,是Sun Microsystems于2006年開始開發的結果。
OpenJDK是自SE 7版以來Java標準版的官方參考實現。
Open JDK 歷史:
* OpenJDK 6項目 - 基于JDK 7,但經過修改后提供了Java 6的開源版本
* OpenJDK 7項目 - 2011年7月28日
* OpenJDK 7u項目 - 該項目開發Java Development Kit 7的更新
* OpenJDK 8項目 - 2014年3月18日
* OpenJDK 8u項目 - 該項目開發Java Development Kit 8的更新
* OpenJDK 9項目 - 2017年9月21日
* OpenJDK 10項目 - 2018年3月10日至20日
* OpenJDK 11項目 - 2018年9月11日至25日
Java 10開始,OpenJDK項目也將每六個月發布一次新功能。但是,OpenJDK不存在STL版本,僅支持對發布的更改,直到下一個版本發布。例如,當OpenJDK 11發布6個月后,OpenJDK 12發布時,OpenJDK 11也就不再進行支持版本更新。
## JDK收費
免費使用的最新版本: 8u201/202
* 在2019年1月之后發布的Oracle JDK 8版本不再免費用于商業用途
* Oracle發布的新的JDK 8的版本更新8u211和8u212,其許可協議從BCL換成了OTN。
* JDK11及之后新發布的JDK,都是使用OTN協議。
Oracle?JDK 8 u191 是2019年1月前發布的最新版本,所以只要一直使用 JDK 8 u191 以及更早的版本,就不需付費。
從2019年1月份開始,Oracle JDK 開始對 Java SE 8 之后的版本開始進行商用收費,確切的說是 8u201/202 之后的版本。如果你用 Java 開發的功能如果是用作商業用途的,如果還不想花錢購買的話,能免費使用的最新版本是 8u201/202
2019年4月16日當天,Oracle發布了Oracle JDK的8u211和8u212兩個版本(屬于JDK8系列),并從這兩個版本開始將JDK的授權許可從BCL換成了OTN!也就是從這兩個版本開始商用收費了。
對于PC, 每用戶每月是2.5美元,對于服務器/云部署,每個processor 每月是25美元
OpenJDK
https://openjdk.java.net/install/
## JDK 免費使用方式
1. 繼續使用BCL許可協議的Oracle JDK版本,即JDK8 8u211之前的版本
2. 使用OpenJDK
3. 其他免費開源JDK實現,比如 Zulu,AdoptOpenJDK,Amazon的Corretto和阿里巴巴的dragonwell等等
## OpenJDK VS Oracle JDK
OpenJDK由Oracle,OpenJDK和Java Community開發。然而,紅帽,Azul Systems,IBM,Apple Inc.,SAP AG等頂級公司也積極參與其開發。
OpenJDK具有GNU通用公共許可證(GNU GPL)是完全開源的,可以自由使用。
Oracle JDK 在響應能力和JVM性能方面要好得多。更加穩定。
* BCL協議,即Oracle Binary Code License Agreement,可以使用JDK,但是不能進行修改。私用和商用都可以,但是JDK中的某些商業特性,是需要付費才可以使用。
* OTN協議,即Oracle Technology Network License Agreement,可以私用,商用需要付費。
## 更新的問題
* JDK8無法更新,存在安全性等風險
* OpenJDK 沒有TLS版本, 也存在沒有更新的風險
為什么要更新。可能h會爆出一些漏洞風險。
解決方法:
* 一直使用OpenJDK 最新版
* 從其他地方獲取OpenJDK的更新支持,比如Red Hat聲明:RHEL支持OpenJDK7,8,11,支持至少6年。
- 1. 基礎篇
- 安裝與環境
- Java 基本概念(JDK,JRE,JVM)
- JDK及版本
- Linux
- 環境變量配置
- 數據類型
- 基本數據類型
- 整型
- String
- 枚舉類型(Enum)
- Array初始化
- Map
- 集合類型
- Java ArrayList
- 日期類型
- 基礎語法
- 循環
- 分支 switch case
- rule switch
- 標準輸入輸出
- 日期
- 高級語法
- Java的新特性
- Java 8 流API(Stream)介紹與示例
- Java 8 方法引用 (Method Reference)快速介紹與示例
- Java 7 try with resource
- Java集合類型對象的快速初始化
- I/O
- Java IO 整體介紹(IO/NIO)
- NIO
- Path
- 同步異步與阻塞非阻塞
- File IO
- 示例代碼
- Java IO 代碼的優化方式
- RandomAccessFile
- Java 文件路徑
- 注解
- @FunctionalInterface 函數式接口
- 獲取類本身信息
- Java匿名內部類
- Lambda
- Java Lambda 表達式快速學習
- Lambda表達式的生動理解以及Java Lambda表達式常見使用場景
- Java Lambda 表達式其他場景
- Java Lambda 代碼段
- Java 8 說透 Consumer
- Java產生隨機數
- Java的錯誤和異常
- 注解-
- @jdk.internal.ValueBased
- 2. 專題篇
- 可變參數
- 性能
- Java Web應用實現GZIP壓縮傳輸
- JVM參數查看與設置
- JVM GC基礎與調優
- list.size()和list.stream().count()哪個更好
- Java VisualVM
- 測試
- Java行為驅動開發與實例
- 基于Cucumber+Selenium 實現Java語言的Web自動化測試
- JUnit 5
- 安全
- JSSE
- Java PKIX path building failed問題解析及解決
- Java使用PBE算法進行對稱加解密
- Java PBE算法
- Java實現Base64編碼和解碼的方式
- SSLSocket
- SSLServerSocket與SSLSocket示例
- Java keytool 命令行工具
- SSL相關的類
- 獲取SSL協議版本
- Java如何安裝https證書
- JWT
- JWT一篇通
- JWT介紹以及java-jwt的使用
- 基于JJWT理解JWT,JWS,JWE
- JJWT快速入門
- JJWT使用完全指南
- 基于jjwt 看透 JWT安全機制
- jose
- Java實現JWT的庫的匯總與比較
- 安全算法
- HMAC
- DES
- AES
- RSA
- Java實現對稱加密(DES,AES)快速入門示例
- Java安全標準算法名稱
- JCA
- 帶證書地址訪問
- JDK SSL
- 安全級別高的加解密
- Java實現URL安全的Base64編碼
- BASE64Decoder
- 多線程
- 線程創建方式
- 可重入鎖與不可重入鎖
- ReentrantLock - 可重入鎖
- 悲觀鎖和樂觀鎖
- 線程安全
- 線程池
- JNDI
- JNDI 基本
- Java使用JNDI調用配置在服務器(Weblogic、Tomcat)的數據源配置
- 模板引擎-FreeMarker
- 測試示例
- FreeMarker快速入門
- Java Mail
- Java 發信API 介紹
- Java Mail 發送163郵箱示例
- 文件
- 大文件拆分
- 文件路徑
- 獲取目錄中最新的文件
- Java刪除某個目錄中的幾天之前的文件
- 字符串
- 字符串替換
- 正則表達式
- 格式化字符串
- Java字符串替換 replaceAll 使用解析
- Java生成隨機字符串
- String array to list
- 系統變量與啟動參數
- JNI與JNA
- 網絡
- Java Socket
- Java反射
- 獲取注解
- 日期與時間
- 關于時間的基本概念
- 一文讀透時區和時間戳以及基于Java的操作
- Java中的時間
- Java 之LocalDateTime的介紹和使用
- ZoneOffSet
- Instant
- 時間格式轉換
- java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: OffsetSeconds
- JSON
- jackson
- 數據訪問篇
- JDBC 入門示例
- JDBC
- 事務
- JPA
- JPA一文通
- Eclipse下安裝EclipseLink進行JPA開發
- EclipseLink+H2 快速搭建JPA開發環境
- 在Eclipse下搭建JPA項目(HIbernate + MySQL)
- 快速搭建JPA開發環境 (Eclipse+Maven+EclipseLink+MySQL)
- JPA 主要API 使用介紹與示例
- JPA之數據查詢的多種方式
- JPA 之 detach方法的使用及注意事項
- JPA查找實體方法之 find和getReference的區別
- JPA之實體類
- JPQL
- JPA 使用 uuid作爲id
- 零拾
- 數據庫
- H2 數據庫簡介
- H2數據庫使用示例
- Spring Data JPA
- 對象序列化
- 集合
- Collections.emptyList() 使用與避坑
- List 排序
- Set
- 如何打印map
- Java如何根據對象屬性值從對象列表中獲取滿足條件的對象
- Java Web專題
- Java Web 及Servlet , Filter ,Listener 基本概念
- Filter ,Servlet配置方式
- Java Servlet開發方式
- Java Web項目命令行打包編譯
- Java數據庫專題
- Java如何執行腳本
- Java如何執行Shell
- Java調用操作系統命令的輸出亂碼問題解決
- Java執行maven
- Runtime 和processbuilder 的區別
- 字符集
- Java的運行
- 設計模式
- 委托模式-Delegate
- Spring Data
- Stream
- Java常用對象類
- 3. 開發篇
- 代碼檢查-CheckStyle
- 注釋
- Java之注釋
- Java Web
- Servlet
- Eclipse+Maven+Tomcat 集成開發環境配置
- Java Servlet + H2數據庫之集成環境配置
- Servlet頁面跳轉方式
- 公用功能
- 獲取類的子類
- 獲取機器名和IP
- 零拾
- 第三方庫
- HttpClient
- MS Project
- 框架篇-Spring/Spring Boot
- 命令行運行方式
- 單元測試
- Spring Boot整合MyBatis Plus
- 日志篇
- Log4J 快速入門示例(Eclipse + Maven)
- Log4J一篇通
- Log4j2 配置文件詳解
- log4j
- Log4J2配置文件參考
- log4j2.properties
- Hibernate 使用Log4j2打印日志
- 單元測試
- 基于Maven配置JUnit5
- 開發規范
- Java命名規范
- Java代碼規范
- Java注釋規范
- 其他規范
- 數據庫命名規范
- MySQl數據庫
- 代碼編排規范
- 4. 問題解決篇
- Unsupported major.minor version 52.0
- java.sql.SQLException: Protocol violation
- Eclipse 中JUnit 5 單元測試沒有運行菜單
- org.apache.catalina.LifecycleException: Protocol handler initialization failed
- java.lang.OutOfMemoryError GC overhead limit exceeded
- 找不到javax.interceptor.InterceptorBinding的類文件
- Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer
- recent version of the Java Runtime (class file version 61.0),
- Exception in thread "main" java.lang.UnsupportedOperationException
- 安裝了多個Java版本如何指定特定版本
- 5. 組件與工具篇
- HttpClient-Http 客戶端
- HttpClient 入門與正確使用姿勢
- HttpClient 基本使用
- HttpClient 如何正確的釋放資源
- HttpClient Fluent API
- HttpClient 響應處理器
- HttpClient4 使用OAuth 2解決方案及示例
- HttpClient 4 Post 帶參數
- HttpClient 忽略證書直接訪問https站點
- HttpClient 使用證書訪問https站點
- Tomcat配置與使用
- Tomcat 下載與安裝
- 基本配置
- Java 與 Tomcat 的版本對應
- Tomcat8 Https 配置
- Java中 H2數據庫的使用
- H2 數據庫簡介
- Java使用H2數據庫全方式匯總
- Apache Common IO
- poi-讀寫Excel
- 異常
- 使用
- Java操作Excel之 POI介紹和入門
- POIFSFileSystem
- 文件加密
- Excel 的版本
- 開發IDE
- VS Code
- VS Code開發Java之快速入門
- VS Code之Java代碼重構和源代碼操作
- 使用VS Code開發Java之注釋的自動生成
- VS Code中的JDK設置
- 注釋模板
- Java Git
- jgit
- 創建分支并提交
- 6. 資源篇
- Java各版本下載
- Maven依賴導入
- JUnit 5 依賴導入
- Java崗位筆試題
- Java常見面試題
- Java基礎
- JVM
- 多線程試題
- 反射
- Web
- 設計模式
- 組件
- 數據庫試題
- 單選題
- Java招聘的一些心得和建議
- 輸入輸出
- 在線API
- 7. 進階篇
- 內存設置
- Java獲取隨機數的正確姿勢
- Java - Graal 編譯器
- JVM-Java虛擬機
- Java如何調用Python
- Java調用 .NET
- Java調用.NET 的方式
- *使用 JNI 和 C++/CLI
- Java常用對象的快速初始化
- StringBuffer Vs StringBuilder
- 8. 延伸篇
- Groovy
- 參考
- Fluent API — 流暢API(基于Java介紹)
- Java版本與收費
- 軟件協議
- 9.實戰篇
- Java千分號格式化double類型的正確姿勢