8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

我可以将 jar 添加到 Maven 2 构建类路径而不安装它们吗?

Ivan Rubinson 1月前

7 0

Maven 2 在开发的实验/快速而粗糙的模型阶段让我抓狂。我有一个 pom.xml 文件,它定义了我想要使用的 web 应用程序框架的依赖项,一个……

Maven 2 在开发的实验/快速而粗糙的模型阶段让我抓狂。

我有一个 pom.xml 文件,它定义了我想使用的 Web 应用框架的依赖项,我可以从该文件快速生成入门项目。但是,有时我想链接到尚未定义文件的第三方库 pom.xml ,因此,与其 pom.xml 手动创建第三方库的文件并安装它,然后将依赖项添加到我的 pom.xml ,我只想告诉 Maven:\“除了我定义的依赖项之外, /lib 还包括其中的任何 jar。\”

这看起来应该很简单,但如果是这样,我就忽略了一些东西。

任何关于如何做到这一点的指示都将不胜感激。除此之外,如果有一个简单的方法可以将 maven 指向一个 /lib 目录,并轻松创建一个 pom.xml 将所有附带的 jar 映射到单个依赖项的目录,然后我可以一次性命名/安装并链接到该目录,这也就足够了。

帖子版权声明 1、本帖标题:我可以将 jar 添加到 Maven 2 构建类路径而不安装它们吗?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Ivan Rubinson在本站《maven》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 如果您使用 Netbeans,请按照以下步骤操作:[如何使用 Netbeans 嵌入式 Maven 将模块安装到 maven 存储库中?][1] [1]:

  • 流行方法的问题

    您在互联网上找到的大多数答案都会建议您将依赖项安装到本地存储库,或者在其中指定 \'system\' 范围, pom 并将依赖项与项目源一起分发。但这两种解决方案实际上都是有缺陷的。

    为什么你不应该采用“安装到本地存储库”方法

    当您将依赖项安装到本地存储库时,它会保留在那里。只要您的分发工件可以访问此存储库,它就可以正常工作。问题是,在大多数情况下,此存储库将驻留在您的本地计算机上,因此无法在任何其他计算机上解决此依赖关系。显然,让您的工件依赖于特定机器并不是解决问题的方法。否则,必须在使用该项目的每台机器上本地安装此依赖项,这并不是更好的选择。

    为什么你不应该采用“系统范围”方法

    使用“系统范围”方法所依赖的 jar 既不会安装到任何存储库,也不会附加到目标包。这就是为什么您的分发包在使用时无法解决该依赖关系的原因。我相信这就是系统范围的使用甚至被弃用的原因。无论如何,您都不想依赖已弃用的功能。

    项目内静态存储库解决方案

    将其放入您的 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>
    

    对于每个具有组 ID 的工件, x.y.z Maven 将在其工件搜索中包含项目目录中的以下位置:

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

    要详细阐述这一点,你可以阅读 此博客文章 .

    使用 Maven 安装到项目仓库

    我建议不要手动创建此结构,而是使用 Maven 插件将您的 jar 作为工件安装。因此,要将工件安装到 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>
    

    帮助脚本

    由于执行每个库的安装命令有点烦人,而且肯定容易出错,所以我创建了一个 实用程序脚本 ,它会自动将文件夹中的所有 jar 安装 lib 到项目存储库,同时自动从文件名称解析所有元数据(groupId、artifactId 等)。该脚本还会打印出依赖项 xml,供您复制粘贴到您的 pom .

    在目标包中包含依赖项

    当您创建项目内的存储库时,您将解决使用其源分发项目依赖项的问题,但从那时起,您的项目的目标工件将依赖于未发布的 jar,因此当您将其安装到存储库时,它将具有无法解析的依赖项。

    为了解决这个问题,我建议将这些依赖项包含在目标包中。您可以使用 Assembly 插件 或更好的 OneJar 插件 。OneJar 的官方文档很容易掌握。

  • 需要注意两点:1) 我建议使用 \'${project.baseUri}repo\' 而不是 \'file://${project.basedir}/repo\' 来获取符合 RFC 标准的 URL,在 Windows 上也是如此。2) 如果您将项目构建为子模块,这种方法似乎会失败,因为 ${project.baseUri} 会解析为模块的子目录。有没有什么办法可以解决这个问题?

  • 这几乎让我成功了 - 但 Nikita 的脚本试图利用我拥有的命名错误的 JAR 文件。所以我制作了一个简化版本,它不会对 groupId 进行任何猜测:github.com/carchrae/install-to-project-repo

  • 真是个绝妙的答案!!做事有两种方式,一种是正确的方式,一种是行之有效的方式,先生,您做事的方式是正确的!

  • 您还可以在这里找到有关如何从 jar 文件自动生成工件的信息:devcenter.heroku.com/articles/local-maven-dependencies

  • 仅适用于丢弃代码

    设置范围==系统并组成groupId,artifactId和version

    <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 中包含系统依赖项 )

  • 谢谢,这真的很接近我想要的。有什么办法可以将它们全部添加为单个条目吗?假设我的 /lib 中有 10 个 jar,我可以通过某种方式将它们全部添加吗,例如使用 /some/path/*.jar 作为 systemPath?还是我仍然必须将每个都视为已知依赖项?不过,这真的很接近我需要的,谢谢!

  • 引用 10

    使用像这样的系统路径:\'${basedir}/lib/BrowserLauncher2-1_3.jar\' ${basedir} 指向你的项目的根目录。

  • A G 1月前 0 只看Ta
    引用 11

    最好在路径中使用 project. 前缀,如下所示:${project.basedir}/lib/AwesomeLib.jar

  • 虽然我理解这正是 OP 所要求的,但我仍然想强调,使用系统范围是一种可怕的做法,强烈反对。请参阅依赖关系+范围。

  • @marioosh 记得这个问题的初衷是为了快速实验。如果你想做一个 mvn 包,把 jar 安装到 repo 中。

  • 您可以在您的项目上创建本地存储库

    例如,如果你 libs 在项目结构中有一个文件夹

    • p2

    • p3

       <repository>     <id>ProjectRepo</id>     <name>ProjectRepo</name>     <url>file://${project.basedir}/libs</url> </repository>
    • p4

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

    就这样。

    详细信息: 如何在 Maven 中添加外部库 (已存档)

  • 引用 15

    当然如果你有像'com.foo.bar'这样的复杂groupId你的目录结构应该是/com/foo/bar/artifactId/version/artifactId-verion.jar

  • 引用 16

    在最后一个目录,也就是jar文件所在的目录,还需要添加相关的pom xml文件。

  • 注意:当使用系统范围( 如本页所述 )时,Maven 需要绝对路径。

    如果您的 jar 位于项目根目录下,则需要在 systemPath 值前面加上 ${basedir} 作为前缀。

  • 这就是我所做的,它也可以解决包问题,并且可以与签出的代码一起使用。

    我在项目中创建了一个新文件夹 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 文件旁边。请注意,我不喜欢上述解决方案,因为它的工作量太大。

  • 我仍然更喜欢我在这里发布的解决方案.com/questions/2229757/...

返回
作者最近主题: