【问题标题】:Manually running jar packaged by Gradle's application plugin手动运行 Gradle 的应用插件打包的 jar
【发布时间】:2015-03-16 19:21:01
【问题描述】:

我创建了一个简单的 gradle 项目,其中包含应用程序插件。我运行 distZip 任务来创建所有 jar 的 zip。下面是我使用的代码:

build.gradle

apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'eclipse'

sourceCompatibility = 1.7
version = '1.0'

repositories {
   mavenCentral()
}

project(':Module') {
    jar {
        manifest {
            attributes 'Main-Class': 'com.sample.HelloWorld'
        }
    }
}

dependencies{
    compile 'joda-time:joda-time:2.7'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

mainClassName = "com.sample.HelloWorld"

com.sample.HelloWorld.java

package com.sample;

import org.joda.time.LocalTime;

public class HelloWorld {
    public static void main(String[] args) {
        LocalTime currentTime = new LocalTime();
        System.out.println("The current local time is: " + currentTime);
    }
}

运行 distZip 任务后,我解压缩生成的 build/distribution/Module-1.0.zip 存档,其目录结构如下:

Module-1.0
|__bin
|__lib
     |__Module-1.0.jar
     |__joda-time-2.7.jar

在lib目录下,我尝试了命令:

java com.sample.HelloWorld -cp Module-1.0.jar;joda-time-2.7.jar

它给出以下输出:

Error: Could not find or load main class com.sample.HelloWorld

然后我尝试了:

java -jar Module-1.0.jar -cp joda-time-2.7.jar

它给出了输出:

Exception in thread "main" java.lang.noClassDefFoundError: org/joda/time/LocalTime...

我确保在我的 Manifest.MF 文件中,Main Class 属性设置为 com.sample.HelloWorld,所以我的问题是为什么运行 java 命令会导致“找不到主类”错误但使用java -jar 命令不会导致该错误?

另外,为什么当我运行java -jar 命令时Java 找不到joda-time-2.7.jar 依赖项?

我知道您可以使用gradlew run 命令运行该程序——我试过了,它运行良好。我只是很好奇为什么运行传统的 java 命令不起作用。

【问题讨论】:

  • 如果我明白你想要做什么。您应该在创建 Jar 的地方使用 fatjar,它的依赖项是自包含的。与 distzip 非常相似的东西只是......它会生成一个带有清单的 fatjar。查看https://github.com/musketyr/gradle-fatjar-plugin。它为您提供了一个非常简单的 gradle 任务来生成 fatjar。
  • @TamLe,如果有任何回答回答了问题并解决了问题,请接受它。

标签: java jar gradle executable-jar


【解决方案1】:

试试这个:

java -cp Module-1.0.jar:joda-time-2.7.jar:. com.sample.HelloWorld

【讨论】:

    【解决方案2】:

    您对 java 的命令行参数是错误的。您需要在-jar 之前指定-cp 参数。在-jar 的参数之后,其他所有内容都是主类的命令行参数。所以你想要的是这样的:

    $ java -cp joda-time-2.7.jar-jar Module-1.0.jar 
    

    另外,您根本不需要这样做,Grade 应用程序插件将为您构建一个 shell 脚本(*nix 系统)和 .bat 文件(Windows)来启动您的程序,所以如果您是在 *nix 上,改为这样做:

    $ Module-1.0/bin/<name_of_the_script_here>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-19
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      相关资源
      最近更新 更多