Как использовать модульные банки в немодульном приложении? - PullRequest
1 голос
/ 07 марта 2020

В разных местах я видел следующую информацию: Классы внутри безымянного модуля могут читать экспортированные пакеты по пути модуля .

Внутри каталог src / calculators у меня есть информация о модуле. java файл:

module calculators {
  exports calculators;
}

Внутри каталога src / calculators / calculators у меня есть файл InterestCalculator. java:

package calculators;

public interface InterestCalculator {

  public double calculate(double principle, double rate, double time);
}

Я скомпилировал модуль с помощью следующей команды:

java --module-source-path src --module calculators -d out

А затем я упаковал скомпилированный модуль с помощью следующей команды:

jar --create --file calculators.jar -C out/calculators/ .

Теперь мое немодулированное приложение имеет следующие классы (в том же каталоге):

import calculators.InterestCalculator;

class SimpleInterestCalculator implements InterestCalculator {

  public double calculate(double principle, double rate, double time){
    return principle * rate * time;
  }
}
import calculators.InterestCalculator;

class Main {
  public static void main(String[] args) {
    InterestCalculator interestCalculator = new SimpleInterestCalculator();

  }
}

Когда я пытаюсь скомпилировать свое приложение, используя модуль с командой:

javac --module-path calculators.jar  *.java

Я получил ошибку:

Main.java:1: error: package calculators is not visible
import calculators.InterestCalculator;
       ^
  (package calculators is declared in module calculators, which is not in the module graph)
SimpleInterestCalculator.java:1: error: package calculators is not visible
import calculators.InterestCalculator;
       ^
  (package calculators is declared in module calculators, which is not in the module graph)
2 errors

Почему? Разве классы приложения не должны читать экспортированные пакеты? Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Поскольку код вашего приложения не является модулем, в среде нет ничего, что указывало бы Java на разрешение модуля calculators. Это приводит к тому, что классы не могут быть найдены, несмотря на размещение файла JAR в пути к модулю. Если вы хотите продолжить использовать путь к модулю для своей библиотеки, вам нужно использовать:

javac --module-path calculators.jar --add-modules calculators <rest-of-command>

Обратите внимание на аргумент --add-modules calculators. Это делает calculators модуль root, заставляя его и все его requires зависимости (транзитивно) в графе модулей. Если ваше приложение должно быть модульным:

module app {
  requires calculators;
}

Тогда вам больше не понадобится --add-modules, поскольку модуль app будет root и для него потребуется модуль calculators.

0 голосов
/ 07 марта 2020

Краткий ответ

Ваша последняя командная строка должна быть:

javac --class-path calculators.jar  *.java

вместо:

javac --module-path calculators.jar  *.java

Почему?

Если вы компилируете немодульное приложение , вам не следует использовать опцию --module-path, но --class-path (или более короткую версию: -cp).

Помните, что модульный JAR по-прежнему работает как обычный JAR. Он просто содержит дополнительную информацию для модульных приложений.

...