Подтвердить что ты не робот

Android-класс java-library module classpath NoClassDefFoundError

Мой проект запущен, и я решил разбить его на отдельные модули - gui и domain. Мой модуль domain не должен знать, что он является частью проекта Android, поэтому я создал модуль java-library и поместил там несколько классов. Он работает как шарм, но есть проблема, когда я добавляю некоторые другие зависимости внутри моего модуля java-library, такого как RxJava. Я создал класс Main, чтобы просто проверить свой код. Создает проходы, но когда он пытается вызвать классы RxJava, он сбой исключается:

    Exception in thread "main" java.lang.NoClassDefFoundError: io/reactivex/Observable
    at com.example.domain.Main.main(Main.java:13)
    Caused by: java.lang.ClassNotFoundException: io.reactivex.Observable
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

Мой основной класс:

package com.example.domain;

import io.reactivex.Observable;

public class Main {

    public static void main(String[] args) {
        Observable.just(1)
                .subscribe(integer -> System.out.println(integer));
    }

}

Мой build.gradle файл:

apply plugin: 'java-library'

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    api 'io.reactivex.rxjava2:rxjava:2.1.2'
}

sourceCompatibility = "1.8"
targetCompatibility = "1.8"

1) Если я использую com.android.library, он работает

2) Если я добавлю библиотеку RxJava в файл .jar, она ничего не изменит

EDIT:

Я просмотрел файл Domain.iml и нашел что-то странное:

<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id=":Domain" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" type="JAVA_MODULE" version="4">
  <component name="FacetManager">
    <facet type="android-gradle" name="Android-Gradle">
      <configuration>
        <option name="GRADLE_PROJECT_PATH" value=":Domain" />
      </configuration>
    </facet>
    <facet type="java-gradle" name="Java-Gradle">
      <configuration>
        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
        <option name="BUILDABLE" value="true" />
      </configuration>
    </facet>
  </component>
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
    <output url="file://$MODULE_DIR$/build/classes/java/main" />
    <output-test url="file://$MODULE_DIR$/build/classes/java/test" />
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
      <excludeFolder url="file://$MODULE_DIR$/build" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="library" exported="" scope="PROVIDED" name="rxjava-2.1.2" level="project" />
    <orderEntry type="library" exported="" scope="PROVIDED" name="reactive-streams-1.0.0" level="project" />
  </component>
</module>

Странная часть - это атрибут scope в orderEntry node

<orderEntry type="library" exported="" scope="PROVIDED" name="rxjava-2.1.2" level="project" />
<orderEntry type="library" exported="" scope="PROVIDED" name="reactive-streams-1.0.0" level="project" />

Если я удалю его вручную:

<orderEntry type="library" exported="" name="rxjava-2.1.2" level="project" />
<orderEntry type="library" exported="" name="reactive-streams-1.0.0" level="project" />

Он работает как шарм.

К сожалению, если я синхронизирую мой файл build.gradle, он переопределяет мои модификации.

Как заставить его работать постоянно и почему это действует так?

4b9b3361

Ответ 1

  Странная часть - это атрибут области в узле orderEntry

<orderEntry type="library" exported="" scope="PROVIDED" name="rxjava-2.1.2" level="project" />
<orderEntry type="library" exported="" scope="PROVIDED" name="reactive-streams-1.0.0" level="project" />

Если я удалю его вручную:

<orderEntry type="library" exported="" name="rxjava-2.1.2" level="project" />
<orderEntry type="library" exported="" name="reactive-streams-1.0.0" level="project" />

Это работает как шарм.

К сожалению, если я синхронизирую свой файл build.gradle, он переопределяет мой модификация.

Вы пытались изменить область действия с помощью структуры проекта Android Studios?

Файл → Структура проекта, затем выберите вкладку Зависимости и добавьте зависимость для требуемого модуля. В вашем случае это будет java-библиотека, я верю.

Насколько я знаю, вы не можете изменить область зависимости после добавления. Так что, если вы уже добавили его, попробуйте удалить и добавить его снова. Обязательно назначьте область реализации и посмотрите, работает ли она.

Я надеюсь, что это было полезно