Maven相關知識梳理

小編最近工作有點小忙,一直沒有更新博客,今天組裏的技術大佬讓小編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依賴
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章