由Gradle建造的JAR无法找到Gson

时间:2016-05-21 11:18:03

标签: java gradle

问题已解决,请阅读最后一节。

"背景"

我正在为一个侧面项目制作一个ToDoApp,作为学习Gradle的借口。初始构建工作正常,JAR按预期工作。 [a] 。但是那个版本没有外部依赖;它是独立的。

我被鼓励为项目添加持久性,我决定使用GSON库(版本2.6.2)来使用JSON。我使用 IntelliJ IDEA(2016.1.2)来编写代码。

现在,我通过IntelliJ中的Maven Repository选项添加了gson-2.6.2工件(在项目结构中)。在编写代码时,我在IntelliJ提示时将库添加到项目的类路径中。当我在IDE中运行它时,代码编译并正常工作。这是一个样本运行:

========ToDo App========


The following commands are recognised:
 ► help
    Display this help message.
 ► add <name>
    Add a new Todo task with the given name and also displays its corresponding ID.
 ► get <id>
    Displays the task with the given id.
 ► mark <id>
    Toggles the given task as completed or incomplete.
 ► print
    Displays all tasks in order of their creation.
 ► update <id> <new text>
    Updates the item with the given id to store the new text.
 ► del <id>
    Deletes the task with the given id.
 ► exit
    Exit the program.


The tasks are :
>> add Get the Gradle build to work. 
New item added with id = 1
>> add Push the stable system to GitHub and wait for Travis to give the green signal.
New item added with id = 2
>> add Proceed
New item added with id = 3
>> print
The tasks are :
•  Get the Gradle build to work.  [ID: 1 Completed: false]
•  Push the stable system to GitHub and wait for Travis to give the green signal. [ID: 2 Completed: false]
•  Proceed [ID: 3 Completed: false]
>> exit

工作正常。 JSON数据按我的预期保存:

{"currentId":3,"toDos":{"1":{"id":1,"name":" Get the Gradle build to work. ","completed":false},"2":{"id":2,"name":" Push the stable system to GitHub and wait for Travis to give the green signal.","completed":false},"3":{"id":3,"name":" Proceed","completed":false}}}

当我重新运行代码时,数据会被正确读回。我的代码非常满意。

&#34;情况&#34;

这是我的build.gradle

group 'ml.cristatus'
version = '0.2'

apply plugin: 'java'

sourceCompatibility = 1.7

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.google.code.gson:gson:2.6.2'
}

jar {
    manifest {
        attributes 'Main-Class': 'ml.cristatus.todo.ToDoApp'
    }
}

当我在Ubuntu 16.04终端上运行gradle build时,JAR文件使用以下输出构建:

:compileJava
warning: [options] bootstrap class path not set in conjunction with -source 1.7
1 warning
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 7.036 secs

This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.13/userguide/gradle_daemon.html

所以我以某种方式设法使事情编译。但是当我尝试使用java -jar build/libs/ToDoApp-0.2.jar运行它时,代码无效:

========ToDo App========


Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/Gson
    at ml.cristatus.todo.repository.ToDoRepositoryWithJSON.<init>(ToDoRepositoryWithJSON.java:25)
    at ml.cristatus.todo.ToDoApp.REPL(ToDoApp.java:38)
    at ml.cristatus.todo.ToDoApp.main(ToDoApp.java:17)
Caused by: java.lang.ClassNotFoundException: com.google.gson.Gson
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 3 more

我可能会犯一些新手的错误,但我似乎无法将手指放在上面。 我做错了什么?值得注意的是,代码编译却无法找到gson工件。我猜它与classpath有关系吗?我不知道。我不确定。

请帮助我。

解决方案

我刚刚将此行添加到jar {}块:

from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }

this tutorial提供。

[a] 这里是version 0.1二进制文件。

1 个答案:

答案 0 :(得分:2)

您必须将带有gson jar的jar文件添加到classpath。当您启动应用程序时(&#34; java -jar build / libs / ToDoApp-0.2.jar&#34; )。有多种方法可以实现。

一种可能的方法是:

将任务添加到您的gradle中,该任务将依赖项(在您的情况下为gson.jar)复制到&#34; lib&#34;目录。当您启动应用程序时,将其添加到classpath。例如,以这种方式&#34; java -cp build / lib / gson.jar -jar build / libs / ToDoApp-0.2.jar&#34;

对你来说可能更好:

将依赖项添加到清单中。这个答案讨论了how to copy the dependencies libraries JARs in gradle 它应该适合你。

下一个选项是:

创建一个&#34; uberjar&#34;它意味着将所有依赖项添加到一个大的jar文件中。我个人不喜欢它。但它会适用于你的情况。如何在gradle中创建uberjar在这里讨论:Building a uberjar with Gradle