2015-01-15 4 views
0

Это кажется старым ответом на вопрос, но у меня все еще есть некоторые проблемы. Я создал веб-сервер, который разделяет некоторые классы как .jar. Это пример общего класса POJOAndroid Studio - добавить .jar library

@JsonInclude(Include.NON_NULL) 
@Entity 
@Table(name = "user", uniqueConstraints = 
{ @UniqueConstraint(columnNames = "email"), 
    @UniqueConstraint(columnNames = "nick") }) 
public class User implements java.io.Serializable, RecognizedServerEntities 
{ 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "id", unique = true, nullable = false) 
    private Integer userId; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "threadAuthor", 
     orphanRemoval = false) 
    @Cascade({ CascadeType.SAVE_UPDATE }) 
    private Set<Thread> userThreads = new HashSet<Thread>(0); 
} 

Теперь я пытаюсь создать приложение для Android, которые просто использовать эти общие классы: приложение не нужно знать ничего о Hibernate или javax.persistence (по крайней мере, это то, что я думаю). Однако, когда я создаю новый проект в Android Studio, для него, похоже, требуются дополнительные библиотеки. Действительно, Gradle процесс сборки генерирует много предупреждений, как

warning: unknown enum constant CascadeType.REMOVE 
    reason: class file for org.hibernate.annotations.CascadeType not found 
warning: unknown enum constant FetchType.EAGER 
    reason: class file for javax.persistence.FetchType not found 

и во время выполнения аварии приложения с этим сообщением журнала

java.lang.NoClassDefFoundError: org/hibernate/annotations/Cascade 

Итак, я должен импортировать эти .jar S в библиотеке и добавить a compile files() до build.gradle? Я еще разработал другое клиентское приложение с использованием Java (Swing), и нет необходимости импортировать эти библиотеки: shared.jar было достаточно. Почему Android требует их?

+0

Вы можете попробовать добавить и посмотреть, что произошло. – bjiang

+0

@bjiang знаю, но есть много библиотек, которые нужно добавить, и кажется ненужной тратой пространства. Тем не менее, я просто попытался добавить javax.persistence и hibernate-core в список jars: пока процесс сборки работает без предупреждений, ошибки во время выполнения все равно происходят. Строго ли нужно добавлять эти банки? – tigerjack89

ответ

1

CascadeType и FetchType являются частью Java EE. Попробуйте использовать findjar для загрузки jar (s), который содержит эти классы.

Даже если вы добавите загруженные баночки в путь к классам, RuntimeException s still migt произойдет, потому что эти библиотеки могут использовать часть Java, которая не является частью Android Java.

Просто попробуйте и дать нам обратную связь :)

+0

Спасибо за ваше время. Можете ли вы взглянуть на комментарий ниже исходного вопроса? Строго ли нужно добавлять эти банки? – tigerjack89

+0

@ tigerjack89 java.lang.NoClassDefFoundError: org/hibernate/annotations/Cascade - я бы попробовал добавить jars :) – mklimek

+0

Еще не пробовал: я больше не компилирую предупреждения, но приложение по-прежнему падает с ошибками во время выполнения. – tigerjack89

1

Now, I'm trying to create an android app that simply use these shared classes: the app doesn't need to know anything about hibernate or javax.persistence (at least, is what I think).

По-видимому, это делает. Некоторые из этих аннотаций могут быть аннотациями времени выполнения, и в этом случае вам понадобятся JAR. Некоторые из тех, которые являются аннотациями времени компиляции, могут распространяться на ссылки на вещи в этих JAR, и это моя интерпретация ваших сообщений об ошибках.

So, do I have to import these .jars as library and add a compile files() to build.gradle?

Вы, безусловно, приветствует попробовать использовать Hibernate на Android, будь то через кувшины или артефакты вверх на где-то, как Maven Central. Я не могу сказать, есть ли порт Hibernate, который работает на Android. Последнее, что я проверил, Hibernate был разработан для использования на стороне сервера с прямым доступом к базе данных, тогда как приложения для Android предназначены для использования на стороне клиента без прямого доступа к базе данных (например, с использованием веб-службы).

+0

Ну, это то, что я сделал до сих пор. Я реализовал проект на стороне сервера, используя классы POJO, и теперь я хотел бы использовать приложение для Android только для доступа к этому серверу. Тем не менее, я поделился некоторыми из этих POJO, так что, например, я могу легко создать нового пользователя из Клиента и отправить его на сервер, который по очереди сохраняет его в базе данных. Кроме того, я разработал еще одно клиентское приложение с использованием Java (Swing), и нет необходимости импортировать эти библиотеки: shared.jar было достаточно. Однако я попытался включить банки в проект Android, но ошибки во время выполнения все еще существуют. – tigerjack89

+0

@ tigerjack89: Что ж, с точки зрения 'javax.persistence', это просто не на Android и вряд ли станет чем-то, что вы можете добавить, поскольку инструменты сборки Android обычно отклоняют классы в приложении (или библиотеке), которые находятся в 'java' или' javax' пространства имен. Однако это не ошибки времени выполнения; они являются предупреждениями. Продолжительность времени Dalvik (и предположительно ART) будет содержать предупреждения о пропавших материалах. Если вам действительно нужен материал, вы столкнетесь с «VerifyError» в момент выполнения кода. – CommonsWare

+0

Предупреждения не являются реальной проблемой. Проблема заключается в том, что во время выполнения, даже после добавления этих библиотек, приложение вылетает, а logcat говорит «java.lang.NoClassDefFoundError: org/hibernate/annotations/Cascade» (однако ошибок сборки нет) – tigerjack89

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