小編最近工作有點小忙,一直沒有更新部落格,今天組裡的技術大佬讓小編share一下關于maven的相關知識,小編着實一慌,畢竟對背景開發不感冒的小編來說 太!難!了!為了明天不丢人,趁着下班,趕緊把明天希望分享的内容梳理一下,也順便學習一下Gradle的内容
一.Dependencies
1.repositories
- maven
- Maven維護了一個中央倉庫(repo1.maven.org),所有第三方庫将自身的jar以及相關資訊上傳至中央倉庫,Maven就可以從中央倉庫把所需依賴下載下傳到本地
- Maven并不會每次都從中央倉庫下載下傳jar包。一個jar包一旦被下載下傳過,就會被Maven自動緩存在本地目錄,是以,除了第一次編譯時因為下載下傳需要時間會比較慢,後續過程因為有本地緩存,并不會重複下載下傳相同的jar包。
- artifactory
- Artifactory是一款Maven倉庫服務端軟體,可以用來在内網搭建maven倉庫,供公司内部公共庫的上傳和釋出,以提高公共代碼使用的便利性
2.dependencies
- api - Api 配置應該用于聲明由庫 API 導出的依賴項,出現在 api 配置中的依賴項将傳遞性地向庫的使用者公開,是以将出現在使用者的編譯類路徑中
- implementation - 實作配置應該用于聲明元件内部的依賴項,在實作配置中發現的依賴項不會向使用者公開,是以不會洩漏到使用者的編譯類路徑中 【依賴關系不再洩漏到使用者的編譯類路徑中,是以您永遠不會意外地依賴于可傳遞的依賴關系 / 由于減少了類路徑大小,編譯速度更快 / 實作依賴關系發生變化時重新編譯的次數更少: 不需要重新編譯使用者 / Pom釋出的内容更少】盡可能使用implementation配置而不是 api
- 那麼什麼時候應該使用 api 配置呢? Api 依賴關系是指在庫二進制接口中至少包含一種類型的依賴關系,通常稱為它的 ABI (應用二進制接口)
- 超類或接口中使用的類型
- 在公共方法參數中使用的類型,包括泛型參數類型(其中 public 是編譯器可見的内容)
- 在公共場所使用的類型
- 公共注釋類型
- 使用implementation
- 方法體中專用的類型
- 專門用于私人成員的類型
- 類型隻存在于内部類中
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
public class HttpClientWrapper {
private final HttpClient client; // private member: implementation details
// HttpClient is used as a parameter of a public method
// so "leaks" into the public API of this component
public HttpClientWrapper(HttpClient client) {
this.client = client;
}
// public methods belongs to your API
public byte[] doRawGet(String url) {
HttpGet request = new HttpGet(url);
try {
HttpEntity entity = doGet(request);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
entity.writeTo(baos);
return baos.toByteArray();
} catch (Exception e) {
ExceptionUtils.rethrow(e); // this dependency is internal only
} finally {
request.releaseConnection();
}
return null;
}
// HttpGet and HttpEntity are used in a private method, so they don't belong to the API
private HttpEntity doGet(HttpGet get) throws Exception {
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
System.err.println("Method failed: " + response.getStatusLine());
}
return response.getEntity();
}
}
- runtimeOnly - 聲明運作時依賴項,而不是在編譯時需要的依賴項。
- providedRuntime \ providedCompile - 這兩個配置的作用域與各自的compile和runtime配置相同,隻是它們沒有添加到 WAR的archive中
- strictly - 任何版本不比對此版本符号将被排除。 這是最強的版本聲明。
- test - 編譯Test時需要用到該jar包 Junit
二.Specific Using
1.io.spring.dependency-management
- Spring開發了一個類似Maven的依賴關系管理功能的Gradle插件,使用插件可以進行依賴項管理
- 使用插件的DSL來直接配置依賴項
- 導入一個或者多個已經存在的Maven bom檔案
2.archivesBaseName \ group
- group相當于groupId 域.公司名.組名
- archivesBaseName相當于artifactId 項目名
3.avoid duplicate dependencies in the sub project
- 提到一個common中并在子項目中引入common依賴