【问题标题】:Replace external jar dependency with local intellij project用本地intellij项目替换外部jar依赖
【发布时间】:2022-02-02 13:02:46
【问题描述】:

所以我有一个 intellij IDEA 项目(项目 A),其中包括一堆外部 jar 库。我目前正在开发其中一个外部 jar 库(项目 B),我想将其替换为我计算机上的本地项目(项目 B)。

所以,简而言之: 我有依赖 jar B 的项目 A 我想用我的本地项目(项目 B)替换 jar B

这样,当我运行项目 A 时,它使用项目 B 本地而不是 Jar B 外部。有谁知道这样做的好方法吗?

【问题讨论】:

  • 如果你进入项目结构选项卡,进入库,找到你的库,找到它的路径,比如“/Users/bla/Library/Caches/Coursier/v1/https/repo1.maven.org /maven2/com/openhtmltopdf/openhtmltopdf-core/1.0.0/openhtmltopdf-core-1.0.0.jar”,我想你可以在那里生成和替换你的新jar:)
  • @DmitriAlgazin “找到路径”是什么意思?在项目结构中找到库后,是否删除/删除它,然后单击“新建项目库”,然后找到本地库?
  • 我的意思是物理上找到路径并用新的 jar 替换,比如复制和替换。实际上@y.bedrov 提出了正确的建议,[File]->[New]->[Module from existing sources]

标签: java gradle intellij-idea jar dependency-management


【解决方案1】:

使用复合构建

您的用例正是 Gradle 中的复合构建的用途。 The docs 甚至提到你的精确用例:

复合构建允许您 [...] 组合通常独立开发的构建,例如在您的应用程序使用的库中尝试修复错误时

复合构建允许您使用该库的本地可用构建项目临时轻松地替换外部依赖库。 (它甚至可以处理多个不同的依赖项。)

完整示例

以下是您为两个项目设置的方法(为简洁起见,省略了 Gradle Wrapper 文件和 Java 源代码):

├── projectA
│   ├── build.gradle
│   └── settings.gradle
└── projectB
    ├── build.gradle
    └── settings.gradle

请注意,这两个项目目录实际上不必是同级的。我在这里只是为了简单起见。在我的最小示例构建中,两个settings.gradle 文件可以为空。两个构建脚本如下所示。

projectA/build.gradle

plugins {
    id 'java'
}

dependencies {
    implementation 'com.example:projectB:1.2.+'
}

repositories {
    // where you get the projectB dependency from normally
}

projectB/build.gradle

plugins {
    id 'java-library'
}

group = 'com.example'
version = '1.2.3'

运行示例

在命令行上

projectA/ 下,只需运行 ./gradlew --include-build ../projectB build(或您感兴趣的任何其他 Gradle 任务)。确保使用 projectB 目录的正确路径。 --include-build 选项自动即时创建复合构建。

在 IntelliJ IDEA 中

您还可以在 IntelliJ 中创建复合构建。为此:

  1. 照常导入 projectA(通过其 build.gradle 文件确保 IntelliJ 自动使用 Gradle 配置)。
  2. 在 Gradle 工具窗口中,单击 + 按钮(“Link Gradle Project”)并选择 projectB 的 build.gradle 文件。
  3. 在 Gradle 工具窗口中右击 projectA 并选择“Composite Build Configuration”。在打开的对话框中,选择 projectB 并单击“确定”。
  4. 在 Gradle 工具窗口中,单击 ? 按钮(“重新加载所有 Gradle 项目”)。

就是这样。您现在应该可以使用 projectA 及其本地可用的依赖项 projectB。

【讨论】:

    【解决方案2】:
    1. 在 IntelliJ IDEA 中打开模块 A;
    2. 转到文件->项目结构->模块->模块A->依赖项(选项卡)->找到并删除B.jar(有“-”按钮);
    3. 接下来单击“+”按钮并添加包含本地模块 B 的已编译类的文件夹。

    【讨论】:

    • 它的 B.jar 是一个库。所以它位于库选项卡下。
    【解决方案3】:

    由于您有标签“gradle”,我假设您将它用于两个项目。在项目B中运行“gradle publishToMavenLocal”,然后刷新项目A的依赖。

    请确保您记得您已完成此操作,并在完成后从本地存储库中删除项目 B。

    【讨论】:

    • 我试过了,它仍然使用原始的 B.jar gradle 依赖项。我需要以某种方式重新加载 Maven 吗?
    • 需要刷新依赖。在项目 A 中,转到 Gradle 选项卡。您的项目应该是树的根。右键单击它并选择“刷新 Gradle 依赖项”。如果您随后查看项目选项卡下的外部库,您应该会看到它在本地 .m2 目录中引用 B 的库,而不是 .gradle\caches。
    • 您需要将 mavenLocal() 添加到项目 A 中的存储库中
    • 好的,谢谢。没错。
    【解决方案4】:

    使用 gradle 的解决方案:

    在项目A build.gradle 中添加mavenLocal() 到存储库。

    ...
    repositories {
      mavenLocal()
      maven { url ... }
    }
    ...
    

    在 Project B 中,您需要 maven-publish 插件和相关任务。

    plugins {
      id 'maven-publish'
    }
    
    sourceSets {
      main {
        java {
          srcDir 'src/main/java'
        }
      }
    }
    
    task sourcesJar(type: Jar) {
      from sourceSets.main.allJava
      classifier = 'sources'
    }
    
    publishing {
      publications {
        mavenJava(MavenPublication) {
          artifactId = rootProject.name //or some string eg.: 'projectb'
          groupId = project.group //or some string eg.: 'com.example'
          version = project.version //or some string eg.: '1.0.3.9'
          from components.java
          artifact sourcesJar
        }
      }
    }
    

    现在您可以从终端运行 publishToMavenLocal 任务,或者从 IntelliJ 中的 Gradle View 运行。 (默认在右侧,gradle选项卡,展开你的项目,在下面发布就可以找到任务了。)

    【讨论】:

    • 你的意思是publishToMavenLocal
    • 所以我尝试了这个,当我回到项目 A 时,它看起来仍然使用原始的 B.jar gradle 依赖项。我尝试刷新依赖项,但我仍然得到这个。还有什么我想念的吗?
    • 对不起,我修好了。 maven local 必须是你的仓库列表中的第一个,并且建议每次运行发布时都更改版本,因为 gradle 缓存(或其他)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2023-01-31
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多