如何强制 IntelliJ 中的 Maven 从本地 .m2 存储库中提取特定依赖项

Posted

技术标签:

【中文标题】如何强制 IntelliJ 中的 Maven 从本地 .m2 存储库中提取特定依赖项【英文标题】:How to force Maven in IntelliJ to pull specific dependency from local .m2 repository 【发布时间】:2017-02-08 11:27:12 【问题描述】:

简介

在我继承的一个特定项目中,我们有一个作为jar 文件的依赖项,它是simple-capcha 的自定义包装器/servlet。 他们告诉我对小包装验证码项目进行特定更改,并生成JAR - 然后在主项目中进行测试。

然后我必须让第二个主项目使用新的JAR 作为依赖项(而不是位于公司工件上的文件)。

当前进程

下面我描述了我正在使用的过程,我觉得效率非常低。 我使用 maven 生成小项目中的 jar 文件。 然后我转到本地 .m2 存储库并将那里存在的 JAR(从 artifactory 下载)替换为新的。

<dependency>
            <groupId>test.company.something.captcha</groupId>
            <artifactId>captcha-common</artifactId>
            <version>0.90</version>
        <!--    <scope>system</scope>
            <systemPath>C:/Users/mbakopoulos/Dropbox/_captcha/target/captcha-common-0.90.jar</systemPath>-->
        </dependency>

最后,我取消注释并注释 &lt;scope&gt;&lt;systemPath&gt; 标记(启用自动导入),以便 intellij 检测到 2 个更改,并强制 maven 从本地 .m2 存储库中提取 @987654330 @在项目中。

最后,具体的JAR 包含一个HTTPServlet,它实际上是在主项目的web.xml 中使用的。在某些时候,当我更改依赖版本时,在JBOSS 部署war 后,我得到了classNotFoundException

<servlet>
        <servlet-name>TheCaptcha</servlet-name>
        <servlet-class><servlet>
    <servlet-name>StickyCaptcha</servlet-name>
    <servlet-class>test.company.something.CaptchaServerServlet</servlet-class>
    <init-param>
        <param-name>width</param-name>
        <param-value>250</param-value>
    </init-param>
    <init-param>
        <param-name>height</param-name>
        <param-value>60</param-value>
    </init-param>       
</servlet>

问题

开发和测试通常作为依赖项包含/包含的依赖项的最佳方法是什么?我可以去掉 pom.xml 条目,并将另一个项目作为模块包含进来吗?

我正在使用 IntelliJ IDEA 2016。

最后,有没有办法将两个模块/项目连接在一起? 我怀疑应该有。

【问题讨论】:

有什么原因你不只是制作一个新版本0.90-A 或类似的? @vikingsteve 我最初是这样尝试的,并使用scopesystemPath 包含依赖关系,但是当我调试主项目时我得到了classNotFoundException。所以我放弃并使用相同的版本/文件名。 你能完全放弃scopesystemPath 并将具有新版本(0.90-A 或其他)的工件放入C:/Users/mbakopoulos/.m2/repository/test/company/something/captcha/captcha-common。只要那是默认的本地存储库,您的构建应该会发现它没问题。也删除那里的任何 lastUpdated 引用。 @vikingsteve 我可以看到这将如何避免覆盖以前的 JAR 版本 - 更清洁/更有条理。每次我将更新的.jar 文件放入m2 存储库时,我是否仍需要编辑pom.xml 依赖项?有没有办法同时连接两个模块/项目? 【参考方案1】:

将我的 cmets 移至此处的扩展答案。

首先,拥有多个不同版本的any 发布的maven 工件具有相同 版本号,这会带来很多问题!如果可能,请避免这样做。编号系统始终可以扩展(例如0.90.10.90-CUSTOM-10.09-A)。

其次,将systemPath 用于依赖项是非标准的。尝试“正常”使用版本,以便在本地工作时它们存在于您的 M2_HOME\.m2\repository 中(并且可以上传到您的工件或链接以与同事共享)。

现在,就构建/测试过程的自动化而言,您有几个选择。您可以构建 0.90.10.90.2 并在每次重新构建依赖项时更新 &lt;dependency&gt; 部分的版本。

或者您可以使用快照版本控制。 0.90.1-SNAPSHOT 向 Maven 表明这是一个快照构建。每当您使用快照依赖项重建项目时,它都会查看该依赖项是否已更改。

最后,您可以将依赖项作为子模块移动到与主项目相同的项目中。然后,您就不必在项目之间定义显式依赖关系。

希望这会有所帮助...

【讨论】:

以上是关于如何强制 IntelliJ 中的 Maven 从本地 .m2 存储库中提取特定依赖项的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ强制更新Maven Dependencies

IntelliJ IDEA强制更新Maven的包

IntelliJ IDEA导入Maven之后强制刷新项目解决无法识别为Maven项目的问题

如何在 Maven 和 Intellij 之间处理 Junits 中的相对路径

IntelliJ IDEA:“Indexed Maven Repositories”列表 - 如何删除此列表中的远程 maven 存储库?

IntelliJ IDEA更新maven依赖包