将外部 jar 依赖替换为本地 intellij 项目

Replace external jar dependency with local intellij project

所以我有一个 intellij IDEA 项目(项目 A),其中包含一堆外部 jar 库。我目前正在处理这些外部 jar 库之一(项目 B),我想用我计算机上的本地项目(项目 B)替换它。

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

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

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

因为你有标签“gradle”,我假设你在两个项目中都使用它。 运行在项目B中“gradlepublishToMavenLocal”然后刷新项目A的依赖

只要确保你记得你做过这件事,并在完成后从你的本地存储库中删除项目 B。

gradle的解决方案:

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

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

在项目 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
    }
  }
}

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

使用组合构建

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

Composite builds allow you to […] combine builds that are usually developed independently, for instance when trying out a bug fix in a library that your application uses

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

完整示例

以下是您为两个项目进行设置的方式(为简洁起见,省略了 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 选项自动创建复合构建 on-the-fly.

在 IntelliJ IDEA 中

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

  1. 照常导入 projectA(通过其 build.gradle 文件以确保 IntelliJ 自动使用 Gradle 配置)。
  2. 在 Gradle 工具 window 中,单击 + 按钮(“Link Gradle 项目”)并select 项目 B 的 build.gradle 文件。
  3. 在Gradle工具window和select“复合构建配置”中右键单击projectA。在打开的对话框中,select projectB 然后单击“确定”。
  4. 在 Gradle 工具 window 中,单击 按钮(“重新加载所有 Gradle 项目”)。

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