小編最近工作有點小忙,一直沒有更新博客,今天組裏的技術大佬讓小編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
- 方法體中專用的類型
- 專門用於私人成員的類型
- 類型只存在於內部類中
- 那麼什麼時候應該使用 api 配置呢? Api 依賴關係是指在庫二進制接口中至少包含一種類型的依賴關係,通常稱爲它的 ABI (應用二進制接口)
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依賴