【问题标题】:`gradle run` without gradle没有gradle的`gradle run`
【发布时间】:2019-09-16 10:14:57
【问题描述】:

在我的 Java 项目中,我使用 gradle 进行依赖管理。我有一个主类org.myorg.MainClass,我可以让它与gradle run一起运行。

但是,当我使用 gradle assembly 生成 jar 时,如果没有 gradle,我无法让它运行。

java -jar assembly.jar 立即结束,没有结果。

我什至补充说:

jar {
    manifest {
        attributes(
                'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
                'Main-Class': 'org.myorg.MainClass'
        )
    }
}

这对主类文件有帮助,但没有帮助。

我也不喜欢 MainClass 在 gradle 文件的不同部分重复出现的事实 - 这意味着如果 MainClass 被更改,我将不得不在几个地方替换它。

【问题讨论】:

  • 作为一个小注释,您可以将it.getName() 简化为it.name 并将整个事情简化为configurations.compile*.name.join(' ')。
  • 您可以在您的jar 任务配置(即'Main-Class': mainClassName)中使用mainClassName(来自application 插件)。

标签: java gradle


【解决方案1】:

运行的不是输出“jar”,而是“fat jar”。 java -jar assembly-fat.jar

【讨论】:

    【解决方案2】:

    您的主要问题可能是您的依赖项没有被引入您的可执行 Jar 文件,并且运行时在执行代码时找不到它们。我只是根据您提出问题的方式进行推测。

    如果我是对的,那么我认为你现在最好的选择是使用 Shadow Jar 插件 (https://imperceptiblethoughts.com/shadow/introduction/)

    Shadow 是一个 Gradle 插件,用于将依赖类和资源与项目组合到单个输出 Jar 中。组合的 Jar 通常被称为 fat-jar 或 uber-jar。 Shadow 利用 JarInputStream 和 JarOutputStream 高效地将依赖库处理到输出 jar 中,而不会产生将 jar 扩展到磁盘的 I/O 开销。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2016-07-13
      • 1970-01-01
      相关资源
      最近更新 更多