У меня есть проект, написанный на Java 8, и я хочу обновить его до Java 9. Поэтому я разделил классы на 2 отдельных модуля. Модули:
- org.ggp.base с модулем-info.java в каталоге org.ggp.base/src/main/java. Его сборка была автоматизирована с помощью Gradle до того, как я начал обновление до Java 9. Модуль использует реализацию абстрактного класса, включенную в модуль pl.edu.prz.klopusz.
- pl.edu.prz.klopusz в каталоге pl.edu.prz.klopusz/dolar-app/src/main/java. Я хочу автоматизировать его сборку с помощью Maven. Для модуля требуется модуль org.ggp.base.
.
├── org.ggp.base/
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── java/
│ │ ├── external/
│ │ │ └── JSON/
│ │ │ ├── JSONArray.java
│ │ │ └── JSONObject.java
│ │ ├── META-INF/
│ │ │ └── MANIFEST.MF
│ │ ├── module-info.java
│ │ └── org/
│ │ └── ggp/
│ │ └── base/
│ │ └── util/
│ │ ├── statemachine/
│ │ │ ├── MachineState.java
│ │ │ └── StateMachine.java
│ │ └── symbol/
│ └── resources/
│ └── org/
│ └── ggp/
│ └── base/
└── pl.edu.prz.klopusz/
└── dolar-app/
└── src/
└── main/
└── java/
├── module-info.java
└── pl/
└── edu/
└── prz/
└── klopusz/
└── utilities/
└── decorators
└──StateMachineDecorator.java
Содержимое файлов модуля-info.java следующее:
org.ggp .base/src/main/java/module-info.java
module org.ggp.base {
requires guava;
requires reflections;
requires jdk.httpserver;
uses org.ggp.base.util.statemachine.StateMachine;
exports org.ggp.base;
}
pl.edu.prz.klopusz/dolar-app/src/main/java/module-info.java
module pl.edu.prz.klopusz {
requires org.ggp.base;
provides org.ggp.base.util.statemachine.StateMachine
with pl.edu.prz.klopusz.utilities.decorators.StateMachineDecorator;
}
Компиляция
Я пытаюсь скомпилировать проект, используя следующую команду:
javac -d out \
--module-source-path org.ggp.base/src/main/java:pl.edu.prz.klopusz/dolar-app/src/main/java \
$(find org.ggp.base/src/main/java -name *.java) \
$(find pl.edu.prz.klopusz/dolar-app/src/main/java -name *.java)
Ошибки
Я получаю следующую ошибку:
< blockquote>
org.ggp.base/src/main/java/module-info.java:1:
ошибка: модуль не найден в исходном пути модуля
модуль org.ggp.base {
И еще 99 ошибок для классов внутри пакета org.ggp.base, каждая из которых например:
org.ggp.base/src/main/java/external/JSON/JSONObject.java:1:
error : нет в модуле по исходному пути модуля
package external.JSON;
или
org.ggp.base/src/main/java/org/ggp/base/validator/OPNFValidator.java:1:
ошибка: отсутствует в модуле по исходному пути модуля
package org.ggp.base.validator;
Что Я хочу
Я хочу избавиться от ошибок и скомпилировать проект. Мне не нужно сохранять структуру каталогов, но когда я собрал все это вместе с двумя файлами модуля-info.java, компилятор пожаловался на несколько модулей. Я могу поручить это IntelliJ IDEA, я не против и попробовал. Но я не знаю, что происходит за кулисами, и как обрабатывать ошибки тоже не знаю(Package is empty: org.ggp.base).
[img]https://i.stack.imgur.com /FmGXL.png[/img]
То, что я уже нашел
Трудно было найти документацию о ключе --module-source-path в команде javac. Этот сайт - это то, что я нашел. Там говорится:
если вы расположите код в своих
модулях так, что вы поместите код модуля во включающий
каталог, названный в честь модуль, путь к источнику модуля становится больше похожим на
простой путь, как в
--module-source-path Users/Me/MyProject/src
или если он находится в нескольких проекты, используйте
--module-source-path
/Users/Me/MyProject/src:/Users/Me/MyOtherProject/src
А для Windows используйте обратную косую черту и точку с запятой, но я все равно использую Linux.
На сайте ошибок OpenJDK также есть комментарий к проблеме с той же ошибкой, что и у меня, но я думаю, что она остается нерешенной.
ОБНОВЛЕНИЕ
-verbose переключатель
Я добавил переключатель -verbose в конце команды. Это часть того, что говорит компилятор:
[parsing started SimpleFileObject[/home/sensitive/org.ggp.base/src/main/java/module-info.java]]
[parsing started SimpleFileObject[/home/sensitive/org.ggp.base/src/main/java/org/ggp/base/util/statemachine/MachineState.java]]
[parsing started SimpleFileObject[/home/sensitive/pl.edu.prz.klopusz/dolar-app/src/main/java/module-info.java]]
[parsing started SimpleFileObject[/home/sensitive/pl.edu.prz.klopusz/dolar-app/src/main/java/pl/edu/prz/klopusz/utilities/decorators/StateMachineDecorator.java]]
org.ggp.base/src/main/java/org/ggp/base/util/statemachine/MachineState.java:1: error: not in a module on the module source path
package org.ggp.base.util.statemachine;
^
[loading /modules/jdk.httpserver/module-info.class]
[loading /modules/java.base/module-info.class]
[total 263ms]
100 errors
Итак, я думаю, что это не ошибка пути в ключе --module-source-path (то же самое поведение происходит с *src/main /java, на что указал @StephanHerrmann). Он читает все источники Java, которые должен прочитать. С исходниками в модуле pl.edu.prz.klopusz проблем нет.
Это первые строки org.ggp.base.util.statemachine.MachineState:
package org.ggp.base.util.statemachine;
import org.ggp.base.util.gdl.grammar.GdlSentence;
import java.util.HashSet;
import java.util.Set;
public class MachineState {
//...
}
Подробнее здесь: https://stackoverflow.com/questions/494 ... ource-path
Мобильная версия