Maven:将自定义外部JAR链接到我的项目的最佳方法是什么?


150

这是我学习Maven的前两天,但我仍在努力学习基础知识。我有一个外部.jar文件(在公共存储库中不可用),我需要在我的项目中引用该文件,我正在尝试找出我的最佳选择。

这是一个小型项目,没有用于库的中央存储库,因此它必须是本地存储库(以某种方式添加到源代码控制中,不知道它是否应该以这种方式工作?)或.jar需要存储在磁盘在任何正式存储库之外。

1)鉴于我希望项目和库都在源代码控制中,因此使用maven将.jar文件添加到项目引用中的最佳选择是什么?

2)我似乎仍然无法让Eclipse看到依赖性。我手动将其添加到pom的这一部分,它在m2eclipse的Dependencies列表中显示得很好。mvn编译和mvn软件包都成功,但是运行程序会导致:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
        LibraryStuff cannot be resolved to a type

这是将POM编辑为:

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${lib.location}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

我是否应该执行mvn install:install-file甚至认为我已经按照上面的方法编辑了pom.xml?

谢谢!

Answers:


67

我认为您应该使用mvn install:install-file库jar填充本地存储库,然后将范围从系统更改为编译。

如果您从maven开始,我建议直接使用maven而不是IDE插件,因为它会增加一层额外的复杂性。

至于错误,您是否将所需的jar放在类路径上?如果您正在使用库中的类型,则还需要在运行时中也可以访问它。这与Maven本身无关。

我不明白为什么要将库放到源代码管理中-它是针对源代码而不是二进制jar。


36
更多关于mvn install::install-filemkyong.com/maven/...
道格·T.

7
使用mvn install::install-file您的本地存储库将意味着任何人谁克隆你的源代码将不得不这样做手动工序为好。否则,打造的是外的箱子破
的Isen吴

但这不会将jar添加到war文件中。
Prachi

206

您可以创建一个项目内存储库,因此不必run mvn install:install-file每次都在新计算机上工作

<repository>
    <id>in-project</id>
    <name>In Project Repo</name>
    <url>file://${project.basedir}/libs</url>
</repository>

<dependency>
    <groupId>dropbox</groupId>
    <artifactId>dropbox-sdk</artifactId>
    <version>1.3.1</version>
</dependency>

/groupId/artifactId/version/artifactId-verion.jar

详细阅读此博客文章

https://web.archive.org/web/20121026021311/charlie.cu.cc/2012/06/how-add-external-libraries-maven


2
使用上述解决方案时,在执行“ mvn clean package”时显示警告-项目<dependency_name>的POM丢失,没有可用的依赖项信息。
Jignesh Gohel 2014年

对于需要添加一个或几个jar文件的情况,这是最好的解决方案。谢谢。
Antonio Sesto

2
或者,您可以直接添加本地依赖项,如stackoverflow.com/a/22300875/640378
mauryat 2015年

2
我必须使用file:/// $ {project.basedir} / libs(3个正斜杠)而不是file:// $ {project.basedir} / libs
Loc Phan

2
如果安装的jar不是Maven编译的jar,则还需要添加一个新的pom文件来定义元数据。为了避免所有这些手动麻烦,建议您使用mvn install:install-file整个目录结构,然后将其从本地存储库复制到项目内存储库。
艾森(Isen Ng)

33

这可以通过使用嵌套在<dependency>元素内的<scope>元素轻松实现。

例如:

 <dependencies>
   <dependency>
     <groupId>ldapjdk</groupId>
     <artifactId>ldapjdk</artifactId>
     <scope>system</scope>
     <version>1.0</version>
     <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
   </dependency>
 </dependencies>

参考:http : //www.tutorialspoint.com/maven/maven_external_dependencies.htm


当您只有Eclipse Embedded Maven且缺少安装插件(脱机系统)时,此方法非常有效,因此无法install在依赖项目上运行目标。Ofc拥有一个气密的系统,并且除了安装插件外,所有插件都非常罕见。
Cardin Lee JH

1
最干净,最简单。
Ajay Kumar

如何添加$ {project.basedir}文件夹之外的本地依赖项路径,例如我想要$ {basedir} \ src \ lib \ ldapjdk.jar路径1在其他文件夹中上移
Naveen Kumar

-我收到错误"The POM for … is missing, no dependency information available” even though it exists in Maven Repository
garg10may

28

Maven手册说要这样做

mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar

4
此命令将lib安装到您的Maven存储库中。这样做的缺点是,如果您尝试在另一台计算机上的项目上工作,则必须再次运行它。
查理·吴

25

更新从那以后,我们就安装了自己的Nexus服务器,更加轻松,整洁。

在我们公司,我们有一些罐子,有些罐子很常见,但是没有存放在任何Maven仓库中,我们也不希望将它们放在本地存储中。我们在Github上创建了一个非常简单的mvn(公共)存储库(但是您可以将其托管在任何服务器上或本地):
请注意,这仅是管理一些很少更改jar文件的理想选择

  1. 在GitHub上创建仓库:
    https://github.com/<user_name>/mvn-repo/

  2. 在pom.xml中添加存储库
    (请注意,完整路径原始文件将与存储库名称有所不同)

    <repository>
        <id>project-common</id>
        <name>Project Common</name>
        <url>https://github.com/<user_name>/mvn-repo/raw/master/</url>
    </repository>
  3. 添加依赖性主机(Github上或专用服务器)
    一个。您只需要知道文件是以@glitch
    /groupId/artifactId/version/artifactId-version.jar
    b提到的模式存储的在主机上创建文件夹以匹配此模式。
    即,如果您有一个名为的jar文件service-sdk-0.0.1.jar,请创建该文件夹,service-sdk/service-sdk/0.0.1/然后将jar文件service-sdk-0.0.1.jar放入其中。
    C。通过尝试从浏览器下载jar来对其进行测试(在我们的示例中:https://github.com/<user_name>/mvn-repo/raw/master/service-sdk/service-sdk/0.0.1/service-sdk-0.0.1.jar

  4. 向您的pom.xml文件添加依赖项:

    <dependency>
        <groupId>service-sdk</groupId>
        <artifactId>service-sdk</artifactId>
        <version>0.0.1</version>
    </dependency>
  5. 请享用


好的,这是我找到的最具扩展性的解决方案,谢谢
Charlie Wu

11

不要使用systemPath。与人们在这里所说的相反,您可以将一个外部jar放在检出的项目目录下的文件夹中,并让Maven像其他依赖项一样找到它。这是两个关键步骤:

  1. 将“ mvn install:安装文件”与-DlocalRepositoryPath一起使用。
  2. 配置存储库以指向POM中的该路径。

这非常简单,您可以在此处找到分步示例:http : //randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html


8

将非Maven Jar添加到Maven项目的Maven方法

Maven项目和非Maven罐子

在构建部分中添加Maven安装插件

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>${version.maven-install-plugin}</version>
        <executions>

            <execution>
                <id>install-external-non-maven1-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar1.group</groupId>
                    <artifactId>non-maven1</artifactId>
                    <version>${version.non-maven1}</version>
                    <file>${project.basedir}/libs/non-maven1.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven2-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar2.group</groupId>
                    <artifactId>non-maven2</artifactId>
                    <version>${version.non-maven2}</version>
                    <file>${project.basedir}/libs/non-maven2.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven3-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar3.group</groupId>
                    <artifactId>non-maven3</artifactId>
                    <version>${version.non-maven3}</version>
                    <file>${project.basedir}/libs/non-maven3.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

添加依赖项

<dependencies>
    <dependency>
        <groupId>jar1.group</groupId>
        <artifactId>non-maven1</artifactId>
        <version>${version.non-maven1}</version>
    </dependency>
    <dependency>
        <groupId>jar2.group</groupId>
        <artifactId>non-maven2</artifactId>
        <version>${version.non-maven2}</version>
    </dependency>
    <dependency>
        <groupId>jar3.group</groupId>
        <artifactId>non-maven3</artifactId>
        <version>${version.non-maven3}</version>
    </dependency>
</dependencies>

参考注解我是博客的所有者


您如何知道jar和Maven安装插件的版本?
osk

罐子的版本刚刚制作完毕,maven安装插件的版本是最新的
craftsmannadeem

7

如果遇到相同的问题,并且正在使用spring-boot v1.4 +,则可以通过这种方式进行。

有一个includeSystemScope,您可以使用到系统范围的依赖性添加到罐子。

例如

我在项目中使用了oracle驱动程序。

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.3.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/resources/extra-jars/ojdbc14-10.2.0.3.0.jar</systemPath>
    </dependency>

然后使includeSystemScope = true将jar包含在路径/ BOOT-INF / lib / **中

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

并从资源中排除以避免重复包含,那么罐子就足够胖了〜

<build>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*.jar</exclude>
            </excludes>
        </resource>
    </resources>
</build>

祝好运!


我一直在寻找这样的解决方案,只是因为当新开发人员到来时,这简化了安装过程。如果没有人工服务器,则在项目中具有自定义依赖项的方式会更容易。同样,当您使用CI时,该解决方案还避免手动将jar安装在CI服务器上。
达尔奇

多个罐子呢?
mithun_ghose

4

更改您的systemPath

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${project.basedir}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

3

pom.xml将查看您的本地存储库,以尝试查找与您的工件匹配的依赖项。另外,您实际上不应该使用系统范围或systemPath属性,这些属性通常保留给JDK中的内容而不是JRE中的内容

有关如何安装Maven工件的信息,请参见此问题


3

请注意,所有使用的示例

<repository>...</respository> 

需要外部

<repositories>...</repositories> 

附上标签。从某些示例尚不清楚。


2

最好的解决方案是安装存储库:Nexus或Artifactory。If为您提供了放置此类内容的地方,并进一步通过从外部缓存您的内容来加快处理速度。

如果您要处理的事情是开源的,则还可以考虑将其放到中心。

请参阅指南


1

使用Eclipse Oxygen,您可以执行以下操作:

  1. 将您的库放在WEB-INF / lib中
  2. 项目->配置构建路径->添加库-> Web应用程序库

安装项目时,Maven会使用它们。


3
如果这样做,其他拉我的项目的用户是否必须在Eclipse中做同样的事情?
cruxi

0

如果外部jar仅由Maven项目创建,则可以在系统上复制整个项目并运行

mvn install

在项目目录中。这会将jar添加到本地maven存储库的.m2目录中。

现在您可以添加

<dependency>
     <groupId>copy-from-the=maven-pom-of-existing-project</groupId>
     <artifactId>copy-from-the=maven-pom-of-existing-project</artifactId>
     <version>copy-from-the=maven-pom-of-existing-project</version>
</dependency>

这将确保您

mvn exec:java 

作品。如果您在这里使用建议

<scope>system</scope>

然后,您必须在通过命令行执行使用时分别添加类。

您可以通过此处描述的以下命令添加外部罐子

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

0

我发现解决此问题的最有效,最干净的方法是使用Github软件包

  1. 根据您的要求在GitHub上创建一个简单的空公共/私有存储库,无论您是否要公开托管外部jar。

  2. 在maven命令下运行,以在上面创建的github存储库中部署外部jar

    mvn deploy:deploy-file \ -DgroupId= your-group-id \ -DartifactId= your-artifact-id \ -Dversion= 1.0.0 -Dpackaging= jar -Dfile= path-to-file \ -DrepositoryId= id-to-map-on-server-section-of-settings.xml \ -Durl=https://maven.pkg.github.com/github-username/github-reponame-created-in-above-step

    上面的命令将在提到的GitHub存储库中部署外部jar -Durl=。您可以在GitHub Packages上将如何将依赖项部署为GitHub包中的链接参阅GitHub Package Deployment Tutorial

  3. 之后,您可以使用添加依赖groupIdartifactIdversion在maven的上述步骤中提到pom.xml并运行mvn install

  4. Maven将从GitHub Packages注册表中获取外部jar的依赖关系,并在您的maven项目中提供。

  5. 为此,您还需要配置您的maven settings.xml以从GitHub软件包注册表中获取。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.