是否能夠在不安裝jar的狀況下將jar添加到maven 2 build classpath?

在試驗/快速而骯髒的開發階段,Maven2讓我發瘋。 python

我有一個pom.xml文件,該文件定義了要使用的Web應用程序框架的依賴項,而且能夠從該文件快速生成啓動程序項目。 可是,有時我想連接到還沒有定義pom.xml文件的第三方庫,所以,不是手動爲第三方庫建立pom.xml文件並安裝它,而後將依賴項添加到個人pom.xml ,我想告訴Maven:「除了定義的依賴項以外,還包括/lib全部jar。」 apache

看起來這應該很簡單,可是若是是這樣,我就缺乏了一些東西。 框架

任何有關如何執行此操做的指針將不勝感激。 簡而言之,若是有一種簡單的方法將maven指向/lib目錄並輕鬆建立pom.xml並將全部封閉的jar映射到單個依賴項,而後我能夠命名/安裝並連接到一個依賴項中,也足夠。 maven


#1樓

您能夠在項目上建立本地存儲庫 ide

例如,若是項目結構中有libs文件夾 ui

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

  • 在pom.xml中,您應該註冊存儲庫 spa

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

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

就這些。 指針

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


#2樓

在與CloudBees的專家進行了很長時間的討論以後,他們討論瞭如何正確地包裝此類JAR,而後提出了一個有趣的好方案:

建立一個僞造的Maven項目,該項目將先前存在的JAR附加爲主要工件,並運行到所屬的POM install:install-file執行中。 這是這種POM的示例:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <id>image-util-id</id>
                    <phase>install</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>${basedir}/file-you-want-to-include.jar</file>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

可是爲了實現它,應該改變現有的項目結構。 首先,您應該記住,對於每種此類JAR,都應建立不一樣的假Maven項目(模塊)。 而且應該建立一個父Maven項目,其中包括全部子模塊:全部JAR包裝器和現有的主項目。 結構能夠是:

XML element) (POM packaging) 根項目(此文件包含父POM文件,其中包括帶有 XML元素的全部子模塊)(POM打包)

JAR 1包裝Maven子項目(POM包裝)

JAR 2包裝Maven子項目(POM包裝)

現有的主要Maven子項目(WAR,JAR,EAR ....包裝)

當經過mvn:install或mvn:packaging運行父級時,將執行子模塊。 這多是一個負號,由於項目結構應該更改,可是最後提供了一個非靜態的解決方案


#3樓

使用<scope>system</scope>是一個糟糕的主意,其緣由已由其餘人解釋,手動將文件安裝到本地存儲庫會使構建沒法複製,並使用<url>file://${project.basedir}/repo</url>也不是一個好主意,由於(1)可能不是格式正確的file URL(例如,若是項目在帶有不尋常字符的目錄中檢出),(2)若是該項目的POM不能使用結果用做其餘人項目的依賴項。

假設您不肯意將工件上傳到公共存儲庫,Simeon建議使用幫助程序模塊來完成這項工做。 可是如今有一種更簡單的方法…

建議

使用non-maven-jar-maven-plugin 。 確實知足您的要求,而沒有其餘方法的缺點。


#4樓

我找到了另外一種方法,請參見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>

#5樓

我在@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
相關文章
相關標籤/搜索