2016-05-21 4 views
1

Проблема решена, прочитайте последний раздел.JAR построен Gradle не найден Gson

«Фоновая»


Делаю ToDoApp только для сайд-проекта, как предлог, чтобы узнать Gradle. Начальная сборка работала нормально, и JAR работал так, как ожидалось. [a]. Но эта версия не имела внешних зависимостей; он был самодостаточным.

Мне было предложено добавить постоянство к проекту, и я решил использовать библиотеку GSON (версия 2.6.2) для работы с JSON. Я использую IntelliJ IDEA (2016.1.2), чтобы написать код.

Теперь я добавил артефакт gson-2.6.2 через опцию Maven Repository в IntelliJ (в Структура проекта). При написании кода я добавил библиотеку в путь к классу проекта при запросе 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' 
    } 
} 

Когда я бег gradle build на моем Ubuntu 16.04 терминала, файл 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.


[а] Вот version 0.1 двоичным.

ответ

2

Вы должны добавить файл jar с gson jar в classpath. При запуске приложения («java -jar build/libs/ToDoApp-0.2.jar»). Существует несколько способов его достижения.

Одним из возможных способов является:

Добавить задачу в свой Gradle, что копирование зависимостей (gson.jar в вашем случае) в «Lib» каталог. И когда вы запускаете приложение, добавьте его в classpath. К примеру, в этом случае "Java -cp построить/Библиотека/gson.jar -jar построить/LIBS/ToDoApp-0.2.jar"

Может быть лучше для вас будет:

Добавить зависимостей в манифесте , В этом ответе обсуждается how to copy the dependencies libraries JARs in gradle Это должно сработать для вас.

Следующая Опция:

Создать «uberjar» означает добавление всех зависимостей в один большой файл фляги. Лично мне это не нравится. Но это будет работать в вашем случае. Как создать uberjar в gradle здесь обсуждается здесь: Building a uberjar with Gradle

+0

Ну, я хочу упаковать эту библиотеку в один JAR-файл. Является ли это возможным? Или мой пользователь должен загружать два отдельных пакета? – Astrobleme

+1

Возможно также. Я добавил его в свой ответ. –

+0

Хотя вы, возможно, не ответили на мой вопрос напрямую, вы показали мне, где искать. Благодаря! :) – Astrobleme

Смежные вопросы