[JAVA]面試知識點整理
1. 背景介紹
Java 語言對我來說即熟悉又陌生的語言,原來是特別喜歡Java,就覺得它是世界最好的語言。 設計的規範非常好,程式碼看起來非常完整,還有巨大的元件/jar庫。 總之來說是非常強大。 隨著幾年沒有接觸過它,慢慢就忘記它了。 就好比一輛車,之前一直經常開覺得很順手,現在重新開起發現當年的感覺比較難找到了。【重拾JAVA】
- 【重拾】Java 的基礎知識
- 【重拾】J2EE 架構
- 【重拾】Java 框架
- 【重拾】Java 專案能力
1.1 Java的願景
- 宗旨:滿足異構,全網分散式環境中應用程式開發的挑戰。這些挑戰中最重要的是安全傳送消耗最少系統資源的應用程式,可以在任何硬體和軟體平臺上執行,並且可以動態擴充套件。【一次編譯,到處執行】
- 目標:開發一個小型的,可靠的,行動式的,分散式的實時操作平臺。
1.2 Java 解決了什麼問題?
- C++ 語言存在弊端,如記憶體洩露,可以解決C++語言的不足,並吸收其他語言的精華
- 解決平臺依賴性,減少程式碼根據不同的平臺來搭建
- 解決使用者在網路開發,嵌入裝置,桌面環境,還是分散式網路環境 提供一站式解決方案。使得開發者專注於業務開發
1.3 自身的要求
- 簡單,面向物件,熟悉
- 健壯和安全
- 架構中立和行動式
- 高效能
- 一次編譯,到處執行
1.4 Java知識體系
1.5 練習專案
1.5.1 個人部落格系統
1.5.2 github 專案(Java)
2 Java 的基礎知識(Java SE), 檢視
2.1 Java 虛擬機器器的架構
根據java的語法生成java檔案/類檔案,然後通過javac 工具,直接把java檔案載入到JVM,然後生成位元組碼。 應用請求JRE環境,JRE把class執行結果返回給應用。
Java SE: CLI 請求JRE環境->呼叫/生成class檔案->呼叫本地庫->輸出
2.1.1 Java HotSpot虛擬機器器,檢視
Java語言的解析器,可以把類檔案編譯生成class檔案的過程。總的過程:1. 歸類: 把執行的物件和變數/物件申請記憶體塊,放到heap裡面,把方法放到方法區域; 2.解析和執行過程:對於類檔案,先編譯,如果有存在空物件/空指標等報錯會丟擲人釋放記憶體,執行完後垃圾回收記憶體;3. 呼叫本地系統的方法,如檔案,I/O等方法,生成class 檔案。
- 類載入器(ClassLoader):在JVM啟動時或者在類執行時將需要的class載入到JVM中。
- 記憶體區(也叫執行資料區):是在JVM執行的時候操作所分配的記憶體區。執行時記憶體區主要可以劃分為5個區域
- 方法區:儲存結構資料,包括變數,建構函式
- 堆(Heap):儲存物件,方法區和堆被java執行緒共享的。
- 棧(Stack):每個執行緒都會建立一個棧,用於儲存區域性變數和操作棧,方法返回值。 棧是私有的,獨立的。
- 程式計數器(PC Register):報錯當前執行緒執行的記憶體地址。方便執行緒之前的切換,還能夠還原到初始狀態。
- 執行引擎:生成class檔案
- 本地方法介面:呼叫c或者c++實現本地方法及返回結果
2.1.2 根據系統處理能力,可以調整下堆大小和棧大小 ,檢視
2.1.3 Java的類載入機制,檢視
類載入的主要思路:對於引用的類,會先在classpath配置裡面找找到就會載入,不然繼續向上找,知道找到rt.jar,如果還不存在,這報錯"ClassNotFoundException"
- 類的繼承載入方式
- 類的載入步驟
總的來說:載入class檔案->驗證->分配記憶體空間->符號解析,變數、常量池->初始化可以使用了
2.2 Java 基本概念,檢視
Java 基礎知識就是怎麼根據Java API生成java類檔案。 Java API包含了元件/工具如下圖結構描述:
2.2.1 Object-Oriented Programming Concepts (面向物件概念)
物件裡麵包含了屬性和方法,通過Main函式啟動CLI 程式來執行對類檔案的解析。
- 物件的概念
public class Bicycle {
int speed = 1;
int gear = 1;
public void addSpeed(int value){
this.speed += value;
}
public int getSpeed(){
return this.speed;
}
public int getGear(){
return this.gear;
}
}
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
Bicycle b = new Bicycle();
b.addSpeed(3);
b.addSpeed(4);
System.out.println("Speed value :"+b.getSpeed());
System.out.println("Gear value :"+b.getGear());
}
}
複製程式碼
- 繼承的概念:子類可以繼承父類的非私有的東西。
public class RoadBicycle extends Bicycle {
private int road =1;
public void setRoad(int val){
this.road += val;
//增加加速值
this.road += this.getGear();
}
public int getRoad(){
return this.road;
}
}
複製程式碼
- 介面的概念:對類和方法的抽象,對於繼承介面的類需要全部實行其類和方法
public class Disk implements Circle{
private int weight = 100;
public void setWeight(){
this.weight += 10;
}
public int getLength() {
return this.weight/3;
}
public int getRadius() {
return this.weight/2;
}
}
複製程式碼
- 陣列的概念:支援多維的陣列
public int[] getArray(){
int [] anArray = new int [10];;
for(int i=0; i<10; i++)
{
anArray[i] = i+10;
}
return anArray;
}
複製程式碼
2.2.2 Language Basics (基本語法)
2.2.3 Classes and Objects (類和物件)
- Lambda 正則表示式
public void invokeCalculator(){
Calculator myApp = new Calculator();
IntegerMath addition = (a,b) -> a + b;
IntegerMath subtraction = (a,b) -> a - b;
System.out.println("40 + 2 = " +
myApp.operateBinary(40,2,addition));
System.out.println("20 - 10 = " +
myApp.operateBinary(20,10,subtraction));
}
複製程式碼
2.2.4 Annotations (註解的機制)
註解是一種元資料形式,提供有關不屬於程式本身的程式的資料。註解對他們註釋的程式碼的操作沒有直接的影響。
-
註解的作用:
- 當你構建你的專案時。構建過程包括生成原始碼,編譯原始碼,生成xml檔案,打包編譯的原始碼和檔案到JAR包等。
- 構建工具如Ant,maven可以根據註解生成原始碼檔案
- Java反射機制可以獲取到這些註解資訊,來生成檔案等
-
註解可以宣告欄位,類,方法,屬性等
-
@Target: 說明瞭Annotation所修飾的物件範圍:Annotation可被用於 packages、types(類、介面、列舉、Annotation型別)、型別成員(方法、構造方法、成員變數、列舉值)、方法引數和本地變數(如迴圈變數、catch引數)。
-
@Retention定義了該Annotation被保留的時間長短 : 1.SOURCE:在原始檔中有效;2.CLASS:在class檔案中有效;3.RUNTIME:在執行時有效
-
@Documented : 用於描述其它型別的annotation應該被作為被標註的程式成員的公共API
-
@Inherited 元註解是一個標記註解,@Inherited闡述了某個被標註的型別是被繼承的。
-
定義註解格式:
  public @interface 註解名 {定義體}
複製程式碼
2.2.5 Interfaces and Inheritance (介面和繼承)
2.2.6 Numbers and Strings (數值型別和字串)
2.2.7 Generics (模板/泛型機制),檢視
-
泛型的作用:在定義類,介面和方法時,泛型使型別(類和介面)成為引數。
- 編譯時就方便型別的檢查
- 消除型別的強制轉換
- 使程式設計師能夠實現通用演演算法。
-
常用的型別引數
E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
T - Type
V - Value
S,U,V etc. - 2nd,3rd,4th types
複製程式碼
- 泛型的程式碼
public class OrderedPair<K,V> implements Pair<K,V> {
private K key;
private V value;
public OrderedPair(K key,V value) {
this.key = key;
this.value = value;
}
public K getKey() { return key; }
public V getValue() { return value; }
}
public interface Pair<K,V> {
public K getKey();
public V getValue();
}
//泛型的處理
Pair<String,Integer> p1 = new OrderedPair<String,Integer>("Even",8);
System.out.println("Generic key :" + p1.getKey() + ",value :" + p1.getValue());
複製程式碼
2.2.8 Packages(包管理概念)
提供了一種包命名的方式
2.3 Java 基本類,包括日期和時間
2.3.1 異常處理
捕獲異常,異常的處理一般在檔案,I/O,資料庫,這些地方存在各種不確定的情況,影響其中斷。
// 捕獲異常
try {
} catch (IndexOutOfBoundsException e) {
System.err.println("IndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
//扔出異常
public Object pop() {
Object obj;
if (size == 0) {
throw new EmptyStackException();
}
obj = objectAt(size - 1);
setObjectAt(size - 1,null);
size--;
return obj;
}
複製程式碼
2.3.2 基本I / O
I 表示輸入流, O 表示輸出流
-
I/O 流主要的方式
-
I/O採用很多設計模式,流是解決獲取資料的載入到記憶體快取區問題 , Writer主要是解決流的序列化/儲存的問題
-
流的型別包括:
- 位元組流:
- 物件序列化流
- 檔案流
- 管
public boolean write(String sourceFileName,String targetFileName) throws IOException{
FileReader inputStream = null;
FileWriter outputStream = null;
try {
System.out.println("Now sourceFile :" +sourceFileName + ",targetFileName: "+ targetFileName);
inputStream = new FileReader(sourceFileName);
outputStream = new FileWriter(targetFileName);
int c;
while ((c = inputStream.read()) != -1) {
outputStream.write(c);
}
// return true;
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
return false;
}
}
複製程式碼
2.3.3 併發
在併發程式設計中,有兩個基本的執行單元:程式和執行緒,一個程式有一個獨立的執行環境。一個程式通常具有一套完整的私有基本執行時資源; 特別是每個程式都有自己的記憶體空間。所以處理大併發的事情,更多的是關係程式或者執行緒對伺服器資源的壓力。包括CPU, 記憶體等
- 執行緒程式碼
現在啟動的方式主要有兩種,一種是實現Runable介面,另一種是繼承Thread
// 每個執行緒都繼承了Runnable方法,每個方法都考慮執行的效果
public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
}
}
// 繼承Thread的方式
public class HelloThread extends Thread {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new HelloThread()).start();
}
}
複製程式碼
- 對於存在記憶體不一致的情況,可以使用synchronized 同步鎖的方式來保持一致性,檢視
這個存在問題就是如果出現一個資源獲得了鎖,另外一個資源確一直沒有釋放鎖,就出現死鎖的情況。 這樣就需要考慮資源的sleep和必要的中斷
- 執行緒池, 檢視
- corePoolSize:核心池的大小
- maximumPoolSize:執行緒池最大執行緒數,這個引數也是一個非常重要的引數
- keepAliveTime:表示執行緒沒有任務執行時最多保持多久時間會終止。
- unit:引數keepAliveTime的時間單位
- workQueue:一個阻塞佇列,用來儲存等待執行的任務
- threadFactory:執行緒工廠,主要用來建立執行緒;
public class Test {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(5,200,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(5));
for(int i=0;i <15 ; i++){
MyTask myTask = new MyTask(i);
executor.execute(myTask);
System.out.println("執行緒池中執行緒數目:"+executor.getPoolSize()+",佇列中等待執行的任務數目:"+
executor.getQueue().size()+",已執行玩別的任務數目:"+executor.getCompletedTaskCount());
}
executor.shutdown();
}
}
class MyTask implements Runnable {
private int taskNum;
public MyTask(int num) {
this.taskNum = num;
}
@Override
public void run() {
System.out.println("正在執行task "+taskNum);
try {
Thread.currentThread().sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task "+taskNum+"執行完畢");
}
}
複製程式碼
2.3.4 平臺環境/屬性
- java.util.Properties
支援對系統的屬性使用Key和value的方式crud。Properties繼承了java.util.Hashtable, 可以使用其一些屬性特性
2.3.5 正則表示式
主要是Java的工具包獲取,Pattern.compile
Console console = System.console();
if (console == null) {
System.err.println("No console.");
System.exit(1);
}
while (true) {
Pattern pattern =
Pattern.compile(console.readLine("%nEnter your regex: "));
Matcher matcher =
pattern.matcher(console.readLine("Enter input string to search: "));
boolean found = false;
while (matcher.find()) {
console.format("I found the text" +
" \"%s\" starting at " +
"index %d and ending at index %d.%n",matcher.group(),matcher.start(),matcher.end());
found = true;
}
if(!found){
console.format("No match found.%n");
}
}
複製程式碼
2.4 集合 & 部署
2.4.1 集合->資料結構&演演算法
集合拆分成三種方式:List(陣列列表) ,Set(不允許有重複元素的集合),Map(key和value 集合).Queue也是其中的一種方式
-
資料結構
-
演演算法
- 排序
- 洗牌
- 常規資料操作
- 搜尋
- 組成
- 極值:最大和最小值
2.4.2 日期/時間
主要使用LocalTime 獲取時間的操作
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("MMM d yyyy");
LocalDate date = LocalDate.parse(input,formatter);
System.out.printf("%s%n",date);
複製程式碼
2.5 反射
反射機制本質就是根據地址塊,如物件,類,方法的地址塊去檢查或者修改其行為。 主要的機制是java 虛擬機器器可以通過名稱空間+類名對記憶體塊的使用。 並且所有類/物件都有其自身的元資料包括public,private,屬性等情況。
2.5.1 作用
好的地方主要是可以外部呼叫,如除錯,開發工具,Spring的根據類名獲取物件,不好的地方主要是效能消耗大,並且可能會影響一些安全
- 應用程式可以外部使用,例如Spring就是使用IoC控制反轉動態呼叫配置的bean 物件
- 類瀏覽器和視覺化開發,很多開發環境,編輯器的提示和方法的建議都是根據這個來的。
- 偵錯程式和測試工具:偵錯程式需要能夠檢查類上的私有成員,測試工具可以利用發射機制呼叫可以發現的API,保證測試的程式碼覆蓋率比較高
2.5.2 反射機制的總體結構
通過執行時載入該類,然後找到這個類的方法和域(一般是解析位元組碼獲得到類相關的元資料),生成列表資訊,最後動態載入該類。
2.6 網路 & RMI & 安全
2.6.1 網路, 檢視
- 網路的拓撲,OSI7層協議轉換成TCP/IP 5層協議
網路一般真正處理是專注於講應用層的資料傳遞到TCP 層,然後通過IP協議轉換
-
資料包的內容
-
Socket 通訊架構
Socket是解決資料兩種,一種是發資料,一種是接受資料,都是通過ip+埠的繫結,服務端是通過迴圈監聽客戶端的Socket資料
- Socket 服務端的程式碼實現,主要還是通過I/O ,檢視 資料流處理。Socket只是建立網路連線通道而已
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
while (true) {
String msg = br.readLine();
if ("exit".equalsIgnoreCase(msg))
break;
System.out.println("("
+ socket.getInetAddress().getHostAddress() + ":"
+ socket.getPort() + "):" + msg);
}
br.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
複製程式碼
- Socket 的長短連線
Http一般有建立連線,傳送請求和接受請求,最後關閉三個過程,如果很長時間才關閉通道,才關閉這算長連線,否則處理完就關閉,算短連線。
2.6.2 RMI(Remote Method Invocation)
遠端方法呼叫這種方式適合內部機器的通訊,但是考慮到系統相容性這種方式也不太好,最後一般會採用內部的http的通訊或者採用webserivce的方式。 主要是通過註冊了這個方法,然後遠端根據方法的引數和規範,來呼叫。 應該也是採用RPC的規範來走的。
- 作用:
方便的是可以針對java語言搞分散式計算跟語言繫結,可以在虛擬機器器註冊列表裡面呼叫任何的註冊服務,但是這個依賴性太強了。後期的protobuf方式就是對現有的替代了。 - 動態程式碼載入的優點: 通過註冊類的方式來動態載入 - 可以呼叫遠端介面和方法: 主要是通過RPC/TCP協議來處理 - 使用RMI建立分散式應用程式 :可以把 - 可以建立分散式應用: 計算引擎
2.6.3 安全,[檢視](docs.oracle.com/javase/tuto…
)
主要是對於java的產品提供安全的認證,包括數字簽名
2.7 JDBC
JDBC 主要解決了,JAVA提供的資料庫驅動API,這樣只要匯入了對應的驅動檔案,就可以呼叫其服務哦。
2.7.1 JDBC 的程式碼,完成基本的連線和資料的讀取操作
- The JDBC API : 提供跟各個資料廠商的統一API, 只需要引入廠商的驅動就可以了
- JDBC Driver Manager : 可以動態的連線多種型別的資料庫
- JDBC Test Suite : 可以測試JDBC的使用特性
- JDBC-ODBC Bridge : 支援呼叫ODBC的邏輯方式
public void connectToAndQueryDatabase(String username,String password) {
Connection con = DriverManager.getConnection(
"jdbc:myDriver:myDatabase",username,password);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a,b,c FROM Table1");
while (rs.next()) {
int x = rs.getInt("a");
String s = rs.getString("b");
float f = rs.getFloat("c");
}
}
複製程式碼
2.8 Java 開發的工具包
2.8.1 系統要求和安裝
2.8.2 JDK檔案,檢視
- 基本工具 (appletviewer,extcheck,jar,java,javac,javadoc,javah,javap,jdb,jdeps)
- 安全工具 (keytool,jarsigner,policytool,kinit,klist,ktab)
- 國際化工具(native2ascii)
- 遠端方法呼叫(RMI)工具(rmic,rmiregistry,rmid,serialver)
- Java IDL和RMI-IIOP工具(tnameserv,idlj,orbd,servertool)
- Java部署工具(javapackager,pack200,unpack200)
- Java Web Start工具(javaws)
- Java故障排除,分析,監視和管理工具(jcmd,jconsole,jmc,jvisualvm)
- Java Web服務工具(schemagen,wsgen,wsimport,xjc)
- 監視工具(jps,jstat,jstatd)
- 疑難解答工具(jinfo,jhat,jmap,jsadebugd,jstack)
- 指令碼工具(jrunscript)
2.8.3 JDK的內容
-
開發工具: (在bin/子目錄中)將幫助您開發,執行,除錯和編寫以Java程式語言編寫的程式的工具和實用程式。有關更多資訊,請參閱工具檔案。
-
執行環境: (在jre/子目錄中)由JDK使用的Java執行時環境(JRE)的實現。JRE包含一個Java虛擬機器器(JVM™),類庫和其他支援執行用Java程式語言編寫的程式的檔案。
-
額外的庫: (在lib/子目錄中)開發工具所需的其他類庫和支援檔案。
-
Java DB: (在db/子目錄中)Java DB,Oracle分佈的Apache Derby關係資料庫。有關更多資訊,請參閱檔案。
-
C檔案頭: (在include/子目錄中)使用Java本地介面,JVM工具介面和Java平臺的其他功能支援原生程式碼程式設計的標頭檔案。
-
原始碼:(In src.zip)構成Java核心API的所有類的Java程式語言原始檔。使用:jar xvf src.zip
2.8.4 Java執行時環境(JRE)
- JRE : 支援java變成語言生成的應用程式,不包含編譯器和除錯開發工具
- JDK : 包含編譯器和除錯開發工具
2.8.5 再編譯
-
javac位元組碼編譯器:
- bin/javac[Solaris作業系統(x86)和Linux]
- bin\javac.exe[Microsoft Windows]
- lib/tools.jar[所有平臺]
-
由以下檔案組成的動態連線機制:
- lib/tools.jar/[所有平臺]
- jre\bin\attach.dll [Microsoft Windows]
-
Java密碼擴充套件:
- /lib/security/local_policy.jar
- /lib/security/US_export_policy.jar
3. Java EE
Java EE: 應用(瀏覽器/其他Clent)傳送http請求 -> 伺服器(tomcat/nginx)-> Java CGI -> 請求JRE環境->呼叫/生成class檔案->呼叫本地庫->輸出
- Java EE 宗旨:在幫助開發人員建立大規模,多層次,可擴充套件,可靠和安全的網路應用程式,即企業應用程式。
- Java EE平臺通過提供允許開發人員專注於功能的開發模型,API和執行時環境來降低企業應用程式開發的複雜性。(專注於業務的開發)
- Java EE 構建的歷史背景,檢視
是在前面RMI發展而來的。 支援滿足企業級開發的方式。 但是標準一致很高,特別是EJB非常難上手,並且關聯的東西非常多。最後,Spring 以j2EE標準基礎上專門切入Bean管理也即是EJB的輕量版本(Model層),然後迅速佔領J2EE的開發框架重要地位,並且慢慢的把controller(Struct)解決了。甚至對V層也有一定的元件和擴充套件。 就出現了Spring MVC 框架。最後為瞭解決EJB分散式開發部署的成本問題,開發了Spring Boot 滿足開發的需求。
3.1 Java EE 架構
3.1.1 Java EE 的架構圖
3.1.2 Java EE 的三層架構,檢視
主要是採用mvc的機制,最後通過Dao層去讀取資料庫
3.1.2 J2EE專案完整開發、測試、部署、釋出環境,檢視
3.2 Java EE 基礎知識,檢視
3.2.1 Java EE API 就是javax的原始碼實現,檢視
3.3 Java Http請求
3.3.1 web 應用的Request 請求
3.3.2 web的目錄結構
4. Java 框架
4.1 Spring mvc,檢視
4.1.2 Spring mvc 的架構,檢視
4.1.3 構建一個基本的MVC的方式
5. Java 專案能力
5.1 IntelliJ IDEA 編輯器熟悉
5.2 工具:Maven
5.2.1 Maven 的工作原理 ,檢視
Maven 本質是解決jar包的統一管理的問題,這樣避免每個專案之前還要下載大量的jar,並且有的時候還需要去找jar很麻煩的。 之前有類似的網站可以下載到各種jar包你根據名字搜尋就好,但是一個個下載不方便。 基於解決這類問題出現了maven. 其實每種語言都有類似的工具,如php 有Composer,python 有pip
5.2.2 使用IDEA 編輯器整合使用,Maven ,檢視
- 重新匯入: 根據pom.xml檔案重新載入依賴庫
- 更新資料夾/原始檔:根據pom.xml檔案生成需要的原始檔
- 開啟設定:主要是設定maven的記憶體限制還有其他的情況
- profiles.xml 建立: 專案/模組必要的資訊,包括id,properties
5.3 工具:Tomcat,檢視
Tomcat 是伺服器主要的是監聽某個埠的伺服器,Tomcat會自動讀取webapps 下的war檔案。 而war檔案Tomcat 會自動把java語言的程式碼根據j2EE的規範來生成war包。
-
對於多個應用的部署,本地可以使用{DOMAIN_NAME}/{app} 來管理多個專案,如果是線上,可以採用Nginx +Tomcat的方式,Nginx 負責分發,Tomcat負責啟動多個服務來監聽Nginx的服務。
-
idea 和 Tomcat 關係: idea 使用Tomcat 把web程式碼生成war包,然後瀏覽器可以通過tomcat解析和處理這個war
5.8 搭建一套部落格系統,檢視
5.8.1 部落格系統的原始碼,檢視
5.8.2 部落格系統的本地部署,檢視
github的wiki 有詳細的解釋
- 使用了外掛:Lombok 來解決pojo下的冗長get,set方法,檢視
5.8.3 把部落格系統部署到線上服務
5.8.4 該部落格系統使用的blade框架,檢視
5.8.5 Tale目錄結構
6. Java 更新日誌
7. Java 能力評估
8. 參考檔案
- Java平臺網站提供有關Java技術,產品資訊,新聞和功能的最新資訊。檢視
- Java平臺檔案提供對白皮書,Java教程和其他檔案的訪問。檢視
- 開發人員服務網站(需要免費註冊)。額外的技術資訊,新聞和功能; 使用者論壇; 支援資訊,等等。檢視
- Java技術產品和API,檢視
- Java 常用元件的架構描述,包括JMS,RMI 檢視
9. 常見的問題
9.1 Spring 類衝突產生的問題,檢視
解決方式:把maven 類檔案重新配置下,對於存在衝突的庫去掉,然後重新匯入下
java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;Ljava/l
複製程式碼
9.2 在mac配置nginx反向代理報錯,檢視
nginx: [error] invalid PID number "" in "/usr/local/var/run/nginx.pid"
複製程式碼
9.3 在mac配置grade home,檢視
## 解決 Mac 下配置環境變數在 ZSH 中無效的問題
在終端中輸入: cat ~/.zshrc 以此來檢視 .zshrc 檔案,找到裡面的 “ # User configuration “ 部分. 可以看到當前 zsh 支援的所有本地已配置環境變數.
## 輸入gradle home和path 目錄
GRADLE_HOME=/usr/local/Cellar/gradle/4.4;
export GRADLE_HOME
export PATH=$PATH:$GRADLE_HOME/bin
複製程式碼
9.4 IntelliJ下gradle location is incorrect問題,檢視
應該使用如下路徑進行設定:/usr/local/Cellar/gradle/2.4/libexec
,問題的關鍵就是路徑要有 libexec
複製程式碼
後續還會持續更新JAVA的知識點,包括JAVA的分散式架構,微服務,高併發的一些文章。 也希望大家有什麼好的建議和想法反饋給我。