天天看點

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依賴