Я хочу «воссоздать» J2ME/CLDC с помощью последней версии javac
(например, 11.0.19
) и скомпилировать специально созданную Java-программу без каких-либо или минимальных базовых классов. Очевидно, что такие классы, как java.lang.Object
или java.lang.String
(и т. д.), должны присутствовать, поскольку они являются основной функцией. Но кроме этого я хочу предоставить свои собственные классы, специфичные для устройства (например, с собственными привязками) и использовать стандартный компилятор javac
.
Я уже немного повозился с вариантами --module-source-path
, -profile
, --class-path
(и другими), но многого не добился. Документация по этим коммутаторам также очень «тонкая».
Есть ли лучшая документация или возможно ли вообще получить ожидаемый результат?
Почему важно избегать зависимостей?
Вы даже не можете правильно определить эту проблему. Каждый класс Java наследуется от java.lang.Object
. Каждый строковый литерал представляет собой String
. Так где именно вы проводите линию?
Как скомпилировать класс Java с помощью javac без каких-либо зависимостей даже от базовых классов, таких как java.lang.*?
Первым шагом будет поиск или подготовка файла JAR (или файлов), содержащего файлы классов для всех «основных» классов. Для J2ME/CLDC у вас должна быть возможность получить существующий файл JAR из существующего дистрибутива. Обратите внимание, что javac
нужны только подписи API для классов, поэтому вы можете использовать JAR, содержащий классы-заглушки; то есть классы без каких-либо фактических деталей реализации.
Затем вы используете опцию -bootclasspath
1, чтобы указать javac
, где найти основные зависимости. Например:
javac ... -bootclasspath /path/to/cldc.jar ... Hello.java
1 - Or --boot-class-path
or -Xbootclasspath
. Check the javac
documentation for the Java JDK version that you are using.
Спасибо! Я нашел действительно минимальный cldc-1.0.jar
, который содержит самые основы, и с javac -verbose --boot-class-path ./cp -target 8 -source 8 Test.java
он сразу заработал. Я не понимаю, почему у меня было столько проблем, но, похоже, это то, что я искал.
Все, что есть в java.lang, является ядром.