如何从 Gradle 中的 JAR 中排除资源并通过 IntelliJ 运行

2024-01-04

我最近开始工作 7 年多旧项目 which 使用 Ant/Ivy用于依赖关系和构建管理。我的任务是将其转换为 Gradle但结构有点不传统:

|- projectRoot
  |- folderA
  |- folderB
  |- projectX
    |- conf
    | |- file1.txt
    |
    |- core
    |  |- src
    |  | |- App.java
    |  |
    |  |- test
    |    |- AppTest.java
    |
    |- res
    | |- file2.txt
    |
    |- ivybuild.xml
    |- ivysettings.xml

Ivy 构建过程相当简单,生成的 dist 文件夹如下所示:

|- dist
  |- proj.jar
  |- lib
  |  |- dep1.jar
  |  |- dep2.jar
  |
  |- conf
  |  |- file1.txt
  |- res
     |- file2.txt

没有资源由于某些配置是在部署期间从单独的存储库应用的,因此资源必须保留在 JAR 外部。

我正在努力寻找一种方法来实现这一目标,同时还让 IDE (Intellij IDEA) 在调试和运行测试期间成功找到资源。

sourceSets {
    main {
        java {
            srcDir 'core/src'
        }
        resources {
            srcDir 'conf'
            srcDir 'res'
        }
    }
    test {
        java {
            srcDir 'core/test'
        }
    }
}
processResources {
    from 'conf' into 'lib/conf'
    from 'res' into 'lib/res'
}
startScripts {
    classpath += files('conf')
    classpath += files('res')
}

通过上述内容,我能够成功运行/测试项目,因为“conf”和“res”中的所有文件都被复制到“build/resources/main”中,这允许调试和测试找到它们。它将两个资源目录复制到输出 lib 文件夹,并将它们添加到运行脚本中的类路径中。

除了资源仍被复制到构建的 JAR 中之外,上述方法均有效。这些会覆盖外部文件夹配置,因此不会起作用。

jar {
    processResources {
        exclude("*")
    }
}

如果我现在跑assemble那么构建的项目正是我想要的,但是 IDE 现在无法成功运行调试器或测试,因为它无法找到下面丢失的文件build/resources/main

我也尝试过idea插件设置资源路径但无济于事。

有办法吗?


使用 Gradle 从 JAR 中排除资源

Example build.gradle

plugins {
    id 'java'
    id 'application'
}

// Project specifics
version '1.0-SNAPSHOT'
group 'com.example'

sourceCompatibility = 1.8
project.mainClassName = "core.ExampleApp"

dependencies {
    testCompile 'junit:junit:4.12'
}

// Define the project source paths
sourceSets {
    main.java {
        srcDir 'core/src'
    }
    test.java {
        srcDir 'core/test'
    }
}

// Exclude all resources from the jar
jar {
    processResources.exclude('*')
}

// Allows the 'test' task to see the directories on the classpath
test {
    classpath += files('conf')
    classpath += files('res')
}

// Allows the 'run' task to see the directories on the classpath
run {
    classpath += files('conf')
    classpath += files('res')
}

// Adds the directories to classpath in the start scripts
// They will have '$APP_DIR/lib/' prepended so they need to be copied into 'dist/lib/'
startScripts {
    run {
        classpath += files('conf')
        classpath += files('res')
    }
}

// Copy 'conf' and 'res' into the 'dist/lib' directory
distributions {
    main {
        contents {
            from('conf').into("lib/conf")
            from('res').into("lib/res")
        }
    }
}

  • 期间发现资源gradle run
  • 期间发现资源gradle test
  • 构建的JAR不包含资源
  • 资源复制到example.zip/lib/conf & .../lib/res
  • 资源内容添加到生成的构建脚本中的类路径中
  • 通过 IntelliJ UI 运行测试确实有效(right click -> run tests e.g.)

BUT:

  • 通过 IntelliJ UI 运行不起作用(right click -> run main() e.g.)

解决:

  • IntelliJ Gradle 插件允许right click -> run and right click -> debug
  • 上面添加了 IntelliJ 运行面板的配置作为一个不错的替代品
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Gradle 中的 JAR 中排除资源并通过 IntelliJ 运行 的相关文章

随机推荐

  • “NOT NULL DEFAULT ''”有什么意义?

    我在我一直从事的项目中的数据库上的许多字段中都看到过这种情况 其中列将被定义为不为空 但默认值为空字符串 这样做有什么意义呢 如果允许空字符串 为什么不只允许字段为空呢 NULL 有特殊的行为 将任何内容与 NULL 进行比较都会返回一个N
  • 在合并配置之前如何测试 dependentabot

    在将它合并到我的存储库之前 有没有办法测试 dependentabot 是否按预期工作 我在一个相当大的团队工作 我想确保我可以在合并之前测试功能 我创建了一个分支 其中向我们的开发分支开放了 PR 有没有办法确保创建更新依赖项的 PR 并
  • 使用 TeamCity 构建后如何部署?

    我正在将 TeamCity 设置为我的构建服务器 我已经设置了我的项目 它正在从 subversion 正确更新 并且构建正常 下一个是什么 理想情况下 我希望将其自动部署到测试服务器 并手动部署到实时 临时服务器 解决这个问题的最佳方法是
  • 从不完整的 HTTP JSON 响应中完成 json 字符串

    有时我会从json api下载数据 它会中途中断 通常是由于网络超时或其他一些问题 但是 在这种情况下 我希望能够读取可用的数据 这是一个例子 response 200 message None params body timestamp
  • 将方法和函数存储在数组中[重复]

    这个问题在这里已经有答案了 我不知道它是否可行 但我可以将方法或函数存储在数组中吗 我现在知道多维数组并用它来存储我想要的许多数组 我现在想做的是将我创建的方法或函数存储在某个类中 因为我想将所有函数存储到某个类 然后如果我想使用循环则调用
  • 从 Web 服务器的 HTML 资源中播放 FLAC

    我正在运行一个 apache2 网站 您可以在其中上传无损文件 包括 wav 和 flac wav 文件可以立即使用 但不支持 flac 所以我想知道是否有什么方法可以在 JavaScript 的帮助下播放这些 flac 文件 发生的情况如
  • Vaadin 和 Spring MVC 集成

    我正在考虑将 Spring MVC 与 Vaadin 框架一起使用的可能性 是否有任何记录在案的方法可以使它们很好地协同工作 另外 将它们一起使用是个好主意吗 与表现有关 我将在专用服务器上运行该应用程序 为了让我的问题更清楚一些 我如何从
  • SQL Server 中“描述表”的等效项是什么?

    我有一个 SQL Server 数据库 我想知道它有哪些列和类型 我更喜欢通过查询来完成此操作 而不是使用像企业管理器这样的 GUI 有没有办法做到这一点 您可以使用sp columns http msdn microsoft com en
  • 引用 google-play-services 库

    我正在使用 Google Maps Android API v2 开发一个项目 当我开始引用 google play services lib 时遇到问题 我的项目图标上出现一个红色感叹号 并且 问题 选项卡中出现一条错误消息 我使用的是
  • EF Code First 不生成表

    我正在开发 EF Code First 站点 并且编写了我的类和上下文类 其来源是 using System using System Collections Generic using System Linq using System T
  • 使子元素(带填充)为父元素的 100% 宽度和高度

    是否可以使子元素 带填充 具有其父元素的 100 宽度和高度 html div div div css child padding 15px 我尝试将子项设置为 100 宽度 高度 但这会使子项由于填充而大于父项 我还尝试使子位置绝对并将顶
  • 修复通过 REST API 上传文件时 Artifactory 中的校验和

    我使用下面的代码通过 Artifactory 的 REST API 上传文件 我的问题是 当我通过 GUI 查看文件时 我收到以下消息 客户端未发布校验和值 如果您信任上传的内容 您可以通过单击 修复 来接受实际的校验和 校验和按钮 如何修
  • 如何使用响应大小的图像来防止卡顿并减少布局偏移?

    我的网站托管了大量各种尺寸的图像 这些图像具有响应能力 并且可以在从桌面到移动设备的所有浏览器宽度上更改大小 我在 Google Search Console 中看到我的 CLS 累积布局偏移 很差 为 0 25 秒 我的网站布局随着图像加
  • 如何用C实现动态调度表

    首先 我了解如何使用函数指针和字符串或其他查找来实现调度表 这不是挑战 我正在寻找的是一种动态向该表添加条目的方法在编译时 我希望的代码结构类型是这样的 Strategy h 包含调度程序的函数定义和调度表定义 Strategy c 包含调
  • 如何在iPhone OS上通过编程发送usd请求

    如何在iPhone OS上通过编程发送usd请求 例如 100 CTCallDialWithID 100 1 并与 CoreTelephony 链接
  • Pycharm 中的多个右边距

    我正在学习 Pycharm Community Edition 3 4 我想知道除了其余代码的常规边距之外 是否可以仅为注释和文档字符串设置正确的边距 我问这个问题是因为我试图遵守 PEP8 指南 即每个注释 72 个字符 常规代码 79
  • 是否有用于创建特定大小的测试文件的Python模块?

    我有一台已上传文件的服务器 我需要分析到该服务器的各种文件大小的上传 响应时间 即上传 10kb 文件 100mb 文件和许多其他大小的文件需要多长时间 我想避免手动创建所有文件并存储它们 是否有一个 Python 模块可以让您创建任意大小
  • 如何从 java 检查 PATH 和 CLASSPATH 环境变量?

    我正在制作一个java程序来使用JMF读取audio wav文件 每次我的计算机重新启动时 我都必须从cmd设置路径 set CLASSPATH WINDIR java classes jmf jar WINDIR java classes
  • 当我关闭 Zope 服务器时,它显示 AttributeError

    我正在使用 Plone 4 3 3 创建我的 Plone 站点 但是当我关闭服务器时 它显示以下错误 Traceback most recent call last File Plone zinstance parts instance b
  • 如何从 Gradle 中的 JAR 中排除资源并通过 IntelliJ 运行

    我最近开始工作 7 年多旧项目 which 使用 Ant Ivy用于依赖关系和构建管理 我的任务是将其转换为 Gradle但结构有点不传统 projectRoot folderA folderB projectX conf file1 tx