java - pom教學 - maven版本




我可以添加罐子到maven 2生成類路徑而不安裝它們嗎? (16)

在實驗/快速和骯髒的模擬開發階段,Maven2令我瘋狂。

我有一個pom.xml文件,它定義了我想要使用的web-app框架的依賴關係,並且可以從該文件快速生成入門項目。 但是,有時我想鏈接到尚未定義pom.xml文件的第三方庫,因此不是手動為第三方庫創建pom.xml文件並安裝它,並將依賴關係添加到我的pom.xml ,我只想告訴Maven:“除了我定義的依賴關係之外,還包括任何在/lib jar。”

這似乎應該是簡單的,但如果是這樣,我錯過了一些東西。

任何指示如何做到這一點非常感謝。 簡而言之,如果有一種簡單的方法可以將maven指向/lib目錄,並輕鬆創建一個pom.xml並將所有封閉的jar映射到單個依賴項,然後我可以一舉命名/安裝並鏈接到該目錄。也足夠了。


流行方法的問題

你可以在互聯網上找到的大部分答案都建議你將依賴關係安裝到本地存儲庫,或者在pom指定一個“系統”作用域,並將依賴項與項目源分配。 但是這兩種解決方案實際上都有缺陷。

為什麼不應用“安裝到本地回購”方法

當你將一個依賴項安裝到本地存儲庫時,它仍然存在。 只要有權訪問此存儲庫,分發工件就會正常工作。 問題是在大多數情況下,這個存儲庫將駐留在本地計算機上,因此無法解決對其他任何計算機的依賴關係。 清楚地讓你的神器依賴於特定的機器不是一種處理事物的方式。 否則,這種依賴性必須在每個使用該項目的機器上進行本地安裝,這種情況並不會好轉。

為什麼不應用“系統範圍”方法

您使用“系統範圍”方法所依賴的jar既不會被安裝到任何存儲庫,也不會附加到您的目標程序包。 這就是為什麼您的發行包在使用時無法解決該依賴性的原因。 我相信這就是為什麼系統範圍的使用甚至被棄用的原因。 無論如何,你不想依賴一個棄用的功能。

靜態的項目內庫解決方案

把它pom你的pom

<repository>
    <id>repo</id>
    <releases>
        <enabled>true</enabled>
        <checksumPolicy>ignore</checksumPolicy>
    </releases>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <url>file://${project.basedir}/repo</url>
</repository>

對於具有xyz形式的組ID的每個工件,Maven將在您的項目dir中包含以下位置以搜索工件:

repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

詳細說明這一點,你可以閱讀這篇博文

使用Maven安裝到項目回購

我建議使用Maven插件將瓶子安裝為工件,而不是手動創建此結構。 因此,要在repo文件夾下將項目安裝到項目庫中,請執行以下命令:

mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]

如果您選擇這種方法,您將能夠簡化pom的存儲庫聲明,以便:

<repository>
    <id>repo</id>
    <url>file://${project.basedir}/repo</url>
</repository>

助手腳本

由於為每個lib執行安裝命令有點麻煩,而且肯定有錯誤,所以我創建了一個實用程序腳本 ,它自動將lib文件夾中的所有jar lib到項目存儲庫,同時自動解析所有元數據(groupId,artifactId等)從文件的名字。 該腳本還會打印出依賴關係xml供您複製粘貼到您的pom

將依賴包括在你的目標包中

當你創建了你的項目庫時,你已經解決了項目的依賴關係和源代碼的問題,但是從那時起,你的項目的目標工件將依賴於未發布的jar,所以當你安裝它到一個倉庫它將有無法解決的依賴關係。

為了解決這個問題,我建議將這些依賴包括在你的目標包中。 這可以通過Assembly Plugin或OneJar插件更好地完成 。 OneJar上的官方文檔很容易理解。


Maven安裝插件具有命令行用法將jar安裝到本地存儲庫中,POM是可選的,但您必須指定GroupId,ArtifactId,Version和Packaging(所有POM內容)。


快速和骯髒的批次解決方案(基於Alex的回答):

libs.bat

@ECHO OFF
FOR %%I IN (*.jar) DO (
echo ^<dependency^>
echo ^<groupId^>local.dummy^</groupId^>
echo ^<artifactId^>%%I^</artifactId^>
echo ^<version^>0.0.1^</version^>
echo ^<scope^>system^</scope^>
echo ^<systemPath^>${project.basedir}/lib/%%I^</systemPath^>
echo ^</dependency^>
)

像這樣執行它: libs.bat > libs.txt 。 然後打開libs.txt並將其內容作為依賴項複製。

就我而言,我只需要庫來編譯我的代碼,而這個解決方案就是最好的解決方案。


僅用於丟棄代碼

設置範圍==系統,只是組成一個groupId,artifactId和版本

<dependency>
    <groupId>org.swinglabs</groupId>
    <artifactId>swingx</artifactId>
    <version>0.9.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>

注意:系統依賴不會被複製到結果jar / war中
(請參閱如何在使用maven構建的war中包含系統依賴關係


即使它不完全適合你的問題,我會在這裡放棄。 我的要求是:

  1. 無法在在線Maven存儲庫中找到的Jars應該位於SVN中。
  2. 如果一個開發人員添加了另一個庫,則其他開發人員不應該為手動安裝而煩惱。
  3. IDE(我的NetBeans)應該能夠找到源代碼和javadoc以提供自動完成和幫助。

先來討論一下(3):只需將文件夾放在一個文件夾中,並將它們合併到最終的jar文件中就行不通了,因為IDE不會理解這一點。 這意味著所有庫必須正確安裝。 但是,我不想讓每個人都使用“mvn install-file”來安裝它。

在我的項目中,我需要metawidget。 開始了:

  1. 創建一個新的Maven項目(將其命名為“shared-libs”或類似的東西)。
  2. 下載metawidget並將zip解壓縮到src / main / lib中。
  3. 文件夾doc / api包含javadocs。 創建內容的壓縮文件(doc / api / api.zip)。
  4. 像這樣修改pom
  5. 構建項目並安裝庫。
  6. 將庫作為依賴項添加到項目中,或者(如果您在shared-libs項目中添加了依賴項)將shared-libs作為依賴項添加到一次獲取所有庫。

每當你有一個新的圖書館,只需添加一個新的執行,並告訴每個人再次建立項目(你可以改善項目層面的這個過程)。


在我們的項目中有什麼作用是Archimedes Trajano寫的,但是我們在.m2 / settings.xml中有這樣的東西:

 <mirror>
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://url_to_our_repository</url>
 </mirror>

*應該改為中央。 所以如果他的回答不適合你,你應該檢查你的settings.xml


如果你想要一個快速和骯髒的解決方案,你可以做以下事情(儘管除了測試項目我不建議這樣做,maven會長時間抱怨這是不合適的)。

為每個需要的jar文件添加一個依賴項,最好使用perl腳本或類似的東西,並將其複制/粘貼到你的pom文件中。

#! /usr/bin/perl

foreach my $n (@ARGV) {

    [email protected]*/@@;

    print "<dependency>
    <groupId>local.dummy</groupId>
    <artifactId>$n</artifactId>
    <version>0.0.1</version>
    <scope>system</scope>
    <systemPath>\${project.basedir}/lib/$n</systemPath>
</dependency>
";

對我來說最簡單的就是配置你的maven-compiler-plugin以包含你的自定義jar。 這個例子將加載lib目錄中的任何jar文件。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <includes>
                    <include>lib/*.jar</include>
                </includes>
            </configuration>
        </plugin>

您可以在您的項目上創建本地存儲庫

例如,如果在項目結構中有libs文件夾

  • libs文件夾中,您應該創建如下目錄結構: /groupId/artifactId/version/artifactId-version.jar

  • 在你的pom.xml中你應該註冊倉庫

    <repository>
        <id>ProjectRepo</id>
        <name>ProjectRepo</name>
        <url>file://${project.basedir}/libs</url>
    </repository>
    
  • 並照常添加依賴項

    <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
    </dependency>
    

就這些。

有關詳細信息: 如何在Maven中添加外部庫


您確實應該通過存儲庫獲得一個框架,並預先確定您的依賴關係。 使用系統範圍是人們常用的錯誤,因為他們“不關心依賴管理”。 麻煩的是,這樣做最終會導致一個變形的maven構建,在正常情況下不會顯示maven。 遵循這樣的方法會更好。


我在@alex lehmann's的回答中提到了一些Python代碼,所以我在這裡發布。

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1

我找到了另一種方法來做到這一點,從Heroku的帖子中看到

總結(抱歉關於一些複製和粘貼)

  • 在根文件夾下創建一個repo目錄:
yourproject
+- pom.xml
+- src
+- repo
  • 運行它以將jar安裝到本地repo目錄
mvn deploy:deploy-file -Durl=file:///path/to/yourproject/repo/ -Dfile=mylib-1.0.jar -DgroupId=com.example -DartifactId=mylib -Dpackaging=jar -Dversion=1.0
  • 添加這個你的pom.xml
<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>


<dependency>
    <groupId>com.example</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0</version>  
</dependency>

注意:使用系統範圍時( 如本頁所述 ),Maven需要絕對路徑。

如果您的jar包在您項目的根目錄下,那麼您需要在$ {basedir}前加上systemPath值。


要安裝不在maven倉庫中的第三方jar,請使用maven-install-plugin。

以下是步驟:

  1. 從源(網站)手動下載jar文件
  2. 創建一個文件夾並將你的jar文件放入其中
  3. 運行以下命令以在本地Maven存儲庫中安裝第三方jar

mvn install:install-file -Dfile = -DgroupId = -DartifactId = -Dversion = -Dpackaging =

下面是我用它來模擬simonsite log4j的例子

mvn install:install-file -Dfile = / Users / athanka / git / MyProject / repo / log4j-rolling-appender.jar -DgroupId = uk.org.simonsite -DartifactId = log4j-rolling-appender -Dversion = 20150607-2059 - Dpackaging =罐子

  1. 在pom.xml中包含如下的依賴項

      <dependency> 
            <groupId>uk.org.simonsite</groupId>
            <artifactId>log4j-rolling-appender</artifactId>
            <version>20150607-2059</version> 
      </dependency>
    
  2. 運行mvn clean install命令來創建包裝

以下是參考鏈接:

https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html


這就是我所做的,它也適用於軟件包問題,它適用於簽出的代碼。

我在項目中創建了一個新文件夾,我使用了repo ,但可以隨意使用src/repo

在我的POM中,我有一個不在公共Maven倉庫中的依賴項

<dependency>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <version>1.0.1</version>
    <scope>runtime</scope>
</dependency>

然後我創建了以下目錄repo/com/dovetail/zoslog4j/1.0.1 ,並將JAR文件複製到該文件夾中。

我創建了下面的POM文件來表示下載的文件(這一步是可選的,但它刪除了警告),並幫助下一個人找出我從哪裡開始的文件。

<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <packaging>jar</packaging>
    <version>1.0.1</version>
    <name>z/OS Log4J Appenders</name>
    <url>http://dovetail.com/downloads/misc/index.html</url>
    <description>Apache Log4j Appender for z/OS Logstreams, files, etc.</description>
</project>

我創建的兩個可選文件是POM和JAR的SHA1校驗和以刪除缺少的校驗和警告。

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar.sha1

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom.sha1

最後,我將下面的片段添加到我的pom.xml文件中,該文件允許我引用本地存儲庫

<repositories>
    <repository>
        <id>project</id>
        <url>file:///${basedir}/repo</url>
    </repository>
</repositories>

這是我們如何添加或安裝本地jar

    <dependency>
        <groupId>org.example</groupId>
        <artifactId>iamajar</artifactId>
        <version>1.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/iamajar.jar</systemPath>
    </dependency>

我給了一些默認的groupId和artifactId,因為它們是必需的:)







maven-2