问题已解决,请阅读最后一节。
我正在为一个侧面项目制作一个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}}}
当我重新运行代码时,数据会被正确读回。我的代码非常满意。
这是我的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二进制文件。
答案 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