【发布时间】: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