我创建了一个包含应用程序插件的简单gradle项目。我运行了distZip任务来创建所有罐子的拉链。以下是我使用的代码:
的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
命令不会导致该错误?
另外,为什么在运行joda-time-2.7.jar
命令时Java无法找到java -jar
依赖项?
我知道你可以使用gradlew run
命令运行程序 - 我试过了,它运行得很好。我非常好奇为什么运行传统的java命令不起作用。
答案 0 :(得分:0)
试试这个:
java -cp Module-1.0.jar:joda-time-2.7.jar:. com.sample.HelloWorld
答案 1 :(得分:0)
java的命令行参数是错误的。您需要在-cp
之前指定-jar
参数。在-jar
的参数之后,其他所有内容都是主类的命令行参数。所以你想要的是:
$ java -cp joda-time-2.7.jar-jar Module-1.0.jar
另外,你根本不需要这样做,Grade应用程序插件会为你构建一个shell脚本(* nix系统)和.bat文件(windows)来启动你的程序,所以如果你& #39;依赖* nix,改为:
$ Module-1.0/bin/<name_of_the_script_here>