【问题标题】:Intellij maven dependency prefer local codeIntellij maven 依赖更喜欢本地代码
【发布时间】:2014-06-24 18:30:30
【问题描述】:

我正在开发一个项目,其中我有一个 android 应用程序项目,该项目对其他项目具有 pom 依赖项 像这样:

<dependencies>
        <dependency>
            <groupId>some.project/groupId>
            <artifactId>some.artifact<artifactId>
            <version>1.0.0</version>
            <type>apklib</type>
        </dependency>
</dependencies>

在开发过程中,我总是希望 Intellij 使用我在项目中拥有的 some.project 库中的本地源代码。
问题是它会从服务器中提取 1.0.0 版本并使用它。
我尝试使用 LATEST 作为版本,只要我的 some.project 库版本更新到服务器上的最新版本,它就可以正常工作。
因为我们有自动构建,在进行更改时会增加 some.project 的版本,所以我会有一个场景,我的源代码是 1.0.0,但服务器有 1.0.1,并且 intellij 将再次拉动服务器 apklib

任何建议如何实现这一目标?如果我可以使用开发配置文件以某种方式将其定义为仅用于开发,并使用产品配置文件来使用确切的版本号(它应该),那将是惊人的。

谢谢!

【问题讨论】:

  • 我想你在问这个问题后的四年里都没有弄清楚这个问题?我尝试了所有四个答案,但都没有奏效。

标签: maven pom.xml intellij-13


【解决方案1】:

您可以在 IntelliJ 中添加模块依赖项: 文件->项目设置->模块单击模块->单击依赖项选项卡,然后单击绿色的“+”号并选择“3.模块依赖'..在本地添加你要依赖的模块,点击蓝色箭头,将模块置于Maven依赖之上。

【讨论】:

  • 不幸的是,这是我目前唯一能够使其适用于 maven 版本范围的方法。 :(
  • 这可能是我正在处理的项目的问题,但是当我尝试这个时,我得到 > 源根目录 "PATH" 不能在模块 "root" 中定义,因为它属于嵌套模块的内容“普通”
  • 更简单的方法进入同一屏幕:单击项目并按 F4,或右键单击项目并选择“打开模块设置”
【解决方案2】:

在 Maven 运行/调试配置下有一个checkbox "resolve Workspace artifacts",选择它然后它将按预期工作。

【讨论】:

  • 在没有评论的情况下被否决真是太烦人了,至少告诉我答案有什么问题,否决者。
  • 不是反对者,但我认为这只是解决方案的一部分。我认为您还必须确保在 pom 中使用正确的版本。
  • 这对我有用。但我认为 resolve Workspace artifacts 设置仅适用于 maven 运行配置。问题是在开发过程中实现这一目标 - 不确定@talarari 的目标是什么
【解决方案3】:

假设您将项目组织为一个多模块项目,并且您正在谈论对作为项目模块之一的库的依赖,那么您需要使用快照依赖,并且您需要使用完整的 Maven 发布过程。实际上,您依赖于给定库的预构建静态版本,但您需要 IntelliJ 来查看您编译的源代码和类,而快照依赖项正是用于此目的。

【讨论】:

  • 感谢回复,我们使用的是快照依赖,所以依赖其实是在1.0.0-snapshot上。问题是,intellij 将下载最新的快照库,而不是使用我的本地代码(所有模块都在我的项目中)
【解决方案4】:

这适用于 Maven 项目,方式如下:

  • 将要使用的依赖项添加到 Maven 项目选项卡。
  • 导航到您正在查找的类的实现
  • 进入实施后,您可以导航回声明的超级方法。

这是Navigate -&gt; Implementation(s) 或 ALT+COMMAND+B(在 Mac 地图上)。 Intellij 将向您提供从依赖列表中的 JAR 或附加的 Maven 项目中的源代码中反编译类的选项。

例如,我在 Rooskie Bank 的项目bank 中,我想查看bank-domain 中的Account 类的代码。我单击帐户对象声明并按 ALT+COMMAND+B。从弹出菜单中,我从源列表中选择在选项中包含“(Maven: com.rooskiebank.bank-domain.jar)”的定义。

IMO 这是一种尴尬的做事方式。尽管我很喜欢它,但我发现 Intellij 很难在具有多个内部库的企业级系统中使用,我仍然经常为它们使用 Eclipse。 Intellij 与 Git 配合得更好,非常适合独立的微服务。

我想 Gradle 以类似的方式工作。

【讨论】:

    【解决方案5】:

    我们正在处理同样的问题...

    “如果这个 Maven 项目在 IDE 中打开并且它的版本与安装在本地 Maven 存储库中的版本匹配,IDEA 应该将依赖项解析为模块依赖类型(而不是本地 jar Maven 库)。”

    https://intellij-support.jetbrains.com/hc/en-us/community/posts/206836605-Always-prefer-local-module-source-over-Maven-dependencies

    我们的解决方案是在 pom.xml 中添加本地 Maven 配置文件并指定本地依赖版本。要让它工作,你必须turn on local profile

    <profiles>
        <profile>
            <id>local</id>
            <properties>
                <dependency.version>x.x.x</dependency.version>
            </properties>
        </profile>
    </profiles>
    

    当本地依赖更新时,你也必须注意更新这个版本,但目前这是我们找到的最好的解决方案,它对我们有用。

    【讨论】:

      【解决方案6】:

      只是一个小提示如何使用 Gradle 做同样的事情。假设您有两个带有 libapp 的工作区。 lib 部署到某个 maven repo 中,需要按以下方式描述:

      // build.gradle
      group 'lib.group'
      version 'lib.version'
      
      // settings.gradle
      rootProject.name = 'lib.name'
      

      app 依赖项如下:

      // build.gradle
      compile "lib.group:lib.name:lib.version"
      

      因此,app 模块使用 lib 作为 maven 依赖项。现在,您可以使用 File | 将 lib 源导入 app 工作区。新 |来自现有来源的模块。从 Gradle 工具窗口刷新项目后,您将在 app 工作区中获得两个模块 libapp。但是,即使在重新导入 Gradle 之后,lib 依赖项仍将指向 maven 存储库,您可以在 File |项目结构。

      这里要做的技巧是在 Gradle 工具窗口中的 app 模块上单击鼠标右键,然后选择 Composite Build Configuration 选项。然后,在弹出窗口中选择本地 lib 模块以将其包含在 app 模块构建中。现在,在为整个工作区再次重新导入 Gradle deps 之后,您将获得 lib 的 maven 依赖项替换为本地依赖项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-21
        • 2017-06-12
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        • 1970-01-01
        • 2017-06-24
        相关资源
        最近更新 更多