【问题标题】:how to add external jar to maven webapp project如何将外部jar添加到maven webapp项目
【发布时间】:2012-05-19 12:17:53
【问题描述】:

我有一个 Spring roo 项目(基本上是一个 maven 项目)。我想将 dropbox sdk 添加到项目中,问题是它不在 maven 中。我添加了以下文件

    <dependency>
        <groupId>com.dropbox</groupId>
        <artifactId>dropbox-sdk</artifactId>
        <version>1.3.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/libs/dropbox-java-sdk-1.3.1.jar</systemPath>
    </dependency>

它解决了编译错误,但是当我运行项目时,在 Spring Tool Suite 中,jar 文件没有添加到 war lib 文件夹中。如何让 maven 将我的外部 jar 文件添加到我的 war lib 文件夹中?

我不想在 maven 中安装 jar,因为我必须在所有使用该项目的机器上安装它

【问题讨论】:

    标签: maven


    【解决方案1】:

    我终于找到了一个简洁的解决方案,它更容易实现。您在 java 项目中添加一个项目内存储库并在 pom.xml 中链接到它。

    您在 maven 中添加一个项目内存储库,如下所示:

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

    然后在项目的根文件夹中创建一个看起来像这样的文件夹结构

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

    并像往常一样添加依赖项。

    这种方法所需的代码和工作量最少,如果该库被添加到 maven 存储库中,您始终可以删除您的项目内存储库。

    http://bit.ly/OGVHSN

    【讨论】:

    • 非常好!获得像“com.some.groupId.with.dots”这样的groupId工作使用目录结构com/some/groupId/with/dots/artifactId/version/...
    • 好方法。在 Linux 上运行良好。但是Windows很烂。 未能在 file://D:\workspace\myApplication/lib 中找到 com.project.maven.plugin:libname:jar:7.20.1.1 - @Nathan Hughes
    • 您好,链接有问题,您可以将其替换为有效的吗?
    【解决方案2】:

    有一个更简单的解决方案,即在插件中设置 webResource。通过该解决方案,您可以将本地磁盘的任何文件添加到战争中!示例如下,

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <warName>api</warName>
                    <webResources>
                        <resource>
                            <directory>libs/</directory>
                            <targetPath>WEB-INF/lib</targetPath>
                            <includes>
                                <include>**/*.jar</include>
                            </includes>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
    

    【讨论】:

      【解决方案3】:

      解决此问题的最佳方法是将这些本地 jar 文件添加到 WEB-INF/lib 文件夹。然后,您会发现所有这些 jar 包都打包在最终的 war 文件中。

      【讨论】:

      • 这很简单,而且很有效。为什么没有其他人提出这个建议?
      【解决方案4】:

      我不推荐这种方法,但您可以添加一些 POM 配置以在单独的配置文件中安装 3rd-party 依赖项:

      <profiles>
          <profile>
              <id>install-dependencies</id>
              <build>
                  <plugins>
                      <plugin>
                          <artifactId>maven-install-plugin</artifactId>
                          <version>2.3.1</version>
                          <executions>
                              <execution>
                                  <id>install-dropbox-sdk</id>
                                  <phase>validate</phase>
                                  <goals>
                                      <goal>install-file</goal>
                                  </goals>
                                  <configuration>
                                      <groupId>com.dropbox</groupId>
                                      <artifactId>dropbox-sdk</artifactId>
                                      <version>1.3.1</version>
                                      <file>src/main/lib/dropbox-java-sdk-1.3.1.jar</file>
                                      <packaging>jar</packaging>
                                  </configuration>
                              </execution>
                          </executions>
                      </plugin>
                  </plugins>
              </build>
          </profile>
      
          <profile>
              <id>build</id>
              <activation>
                  <activeByDefault>true</activeByDefault>
              </activation>
      
              <dependencies>
                  <dependency>
                      <groupId>com.dropbox</groupId>
                      <artifactId>dropbox-sdk</artifactId>
                      <version>1.3.1</version>
                  </dependency>
              </dependencies>
          </profile>
      </profiles>
      

      这里有两个配置文件:install-dependenciesbuild。第一个将dropbox-sdk 依赖项安装到您的Maven 存储库中,并且需要在每台机器上运行一次,如下所示:

      mvn -Pinstall-dependencies validate
      

      第二个默认启用,并将 Dropbox SDK 添加为依赖项。

      说实话,这并不比跑步好多少

      mvn install:install-file -Dfile=src/main/lib/dropbox-java-sdk-1.3.1.jar -DgroupId=com.dropbox -DartifactId=dropbox-sdk -Dversion=1.3.1 -Dpackaging=jar
      

      在每台机器上。

      这种方法的另一个缺点是您还必须将 dropbox-sdk 的所有依赖项添加到您的构建中 - 而如果通过将 JAR 和 POM 添加到存储库服务器来正确完成,那么 Maven将正确计算传递依赖关系。

      【讨论】:

      • 我想出了如何在项目存储库中使用,解决了问题
      【解决方案5】:

      我建议在 Maven 存储库服务器(例如 Nexus 或 Artifactory)中创建“第三方”存储库,然后将 jar 上传到那里。尽管这意味着将 jar 放入 Maven,但至少通过存储库服务器,任何将构建您的应用程序的人都可以使用它。

      【讨论】:

      • 我不想为 repo 运行任何额外的服务器,我可以使用任何公共 repo 吗?
      • 即使您解决了 Dropbox 依赖关系,如果不使用内部存储库,您也会遇到许多其他问题。如果您不想管理额外的服务器,您可以随时使用 SaaS 版本 - jfrog.com/art-online.php
      • 参见stackoverflow.com/questions/10533131/… - Dropbox SDK 目前没有公共 Maven 存储库。
      【解决方案6】:
      1. 将库路径更改为: src/main/webapp/WEB-INF/lib

      2. 在 pom.xml 中:

        &lt;systemPath&gt;${project.basedir}/src/main/webapp/WEB-INF/lib/xxxx.jar&lt;/systemPath&gt;

      【讨论】:

        【解决方案7】:

        我知道我真的迟到了,但我想知道你为什么不将 jar 放入 .m2 文件的本地 repo 中并从那里添加对 pom 的引用?

        【讨论】:

        • 需要解决的问题是使项目可移植,其他人签出这个项目不会在他们的本地仓库中有jar
        猜你喜欢
        • 1970-01-01
        • 2013-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        相关资源
        最近更新 更多