С Oracle Java 13 java команда это две опции, которые вы пытались использовать:
--add-opens module/package=target-module(,target-module)*
--patch-module module=file(;file)*
но:
--add-opens
не поможет вам, потому что он открывает один модуль для других модулей. У вас есть только один модуль. --patch-module
должен указывать каталоги (или файлы jar), которые вы хотите вставить в модуль. Я заметил, что есть ;
, а не :
, как вы использовали. Мне кажется, что вы говорили java исправлять файлы из того же каталога, где находится ваш модуль, с помощью :ModuleInfoExample
.
Вам нужно только добавить файлы из ModuleInfoTest/
в ваш модуль. Я создал структуру из вашего Вопроса и запустил ее:
Компиляция:
javac -d target/ModuleInfoExample src/ModuleInfoExample/*.java src/ModuleInfoExample/com/stackoverflow/examplepackage/*.java
javac -cp target/ModuleInfoExample -d target/ModuleInfoTest src/ModuleInfoTest/com/stackoverflow/examplepackage/*.java
Запуск Main из модуля - без добавления классов:
java --module-path target/ModuleInfoExample --module com.stackoverflow.examplemodule/com.stackoverflow.examplepackage.Main
prints:
Hello world - I'm private
Запуск AnyClass из модуля - нет добавленных классов - ожидается исключение
java --module-path target/ModuleInfoExample --module com.stackoverflow.examplemodule/com.stackoverflow.examplepackage.AnyClass
Error: Could not find or load main class com.stackoverflow.examplepackage.AnyClass in module com.stackoverflow.examplemodule
Запуск AnyClass из модуля - добавление AnyClass в пакет:
java --module-path target/ModuleInfoExample --patch-module com.stackoverflow.examplemodule=target/ModuleInfoTest --module com.stackoverflow.examplemodule/com.stackoverflow.examplepackage.AnyClass
prints:
Inside AnyClass - calling Main: Hello world - I'm private
field.get() = I'm private
field.get() = I'm not private anymore
Общая структура:
>tree /f
..snip..
C:.
+---src
¦ +---ModuleInfoExample
¦ ¦ ¦ module-info.java
¦ ¦ ¦
¦ ¦ +---com
¦ ¦ +---stackoverflow
¦ ¦ +---examplepackage
¦ ¦ Main.java
¦ ¦
¦ +---ModuleInfoTest
¦ +---com
¦ +---stackoverflow
¦ +---examplepackage
¦ AnyClass.java
¦
+---target
+---ModuleInfoExample
¦ ¦ module-info.class
¦ ¦
¦ +---com
¦ +---stackoverflow
¦ +---examplepackage
¦ Main.class
¦
+---ModuleInfoTest
+---com
+---stackoverflow
+---examplepackage
AnyClass.class
src \ ModuleInfoExample \ module-info. java:
module com.stackoverflow.examplemodule {
// exports com.stackoverflow.examplepackage; // no need to export. Nothing is using this
}
src \ ModuleInfoExample \ com \ stackoverflow \ examplepackage \ Main. java:
package com.stackoverflow.examplepackage;
public class Main {
private String privateString = "I'm private";
public static void main(String[] args) {
new Main().hello();
}
public void hello(){
System.out.println("Hello world - " + privateString);
}
}
src \ ModuleInfoTest \ com \ stackoverflow \ examplepackage \ AnyClass. java:
package com.stackoverflow.examplepackage;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class AnyClass {
public static void main(String[] args) {
testhello();
System.out.println();
breakhello();
}
public static void testhello(){
System.out.print("Inside AnyClass - calling Main: ");
Main test = new Main();
test.hello();
}
public static void breakhello(){
try {
// Not necessary - same package, but..
Class<?> mainClass = Class.forName("com.stackoverflow.examplepackage.Main");
Constructor<?> constructor = mainClass.getConstructor();
Object main = constructor.newInstance();
// Getting, printing and changing the field..
Field field = mainClass.getDeclaredField("privateString");
field.setAccessible(true);
System.out.println(" field.get() = " + field.get(main));
field.set(main,"I'm not private anymore");
System.out.println(" field.get() = " + field.get(main));
} catch (Exception e) { // Sorry, all in one big bucket
System.out.println("Error: " + e);
}
}
}