Как скомпилировать для целевой Java 1.0 - PullRequest
0 голосов
/ 10 февраля 2019

Я хочу скомпилировать мой код до версии Java 1.0.

Мне удалось скомпилировать до 1.1:

$ java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
$ javac -target 1.2 -source 1.2 MyClass.java
(works with some warnings)
$ javac -target 1.1 -source 1.2 MyClass.java
(works with some warnings)

Но опция target, похоже, непринять 1.0:

$ javac -target 1.0 -source 1.2 MyClass.java
javac: invalid target release: 1.0

Как настроить таргетинг на JDK 1.0?

Я хочу, чтобы мой файл .class и .jar работалкак можно больше систем, включая очень старые, включая JDK 1.0.(У меня нет доступа к системе под управлением JDK 1.0.)

Что я пробовал до сих пор:

  • Компиляция с ecj-3.0.2.jar: не поддерживает -target 1.0, минимум -target 1.1.
  • Компиляция с JDK 1.0: я не смог запустить его, он не был выпущен для Linux.
  • Компилирование с JDK 1.1: я не смогДля Linux он не был выпущен.
  • Компиляция с JDK 1.2: двоичный файл javac для Linux i386 не работает, он дает мне Ошибка сегментации .
  • Компиляция с JDK 1.3: javac: invalid target release: 1.0.
  • Компиляция с JDK 1.4: javac: invalid target release: 1.0.
  • Компиляция с JDK 1.5: javac: invalid target release: 1.0.Это первый JDK с двоичными файлами Linux amd64.
  • Компиляция с JDK 1.6: javac: invalid target release: 1.0.
  • Компиляция с JDK 1.7: javac: invalid target release: 1.0.
  • Компиляция с JDK 1.8: javac: invalid target release: 1.0.(Я получил эту ошибку первым, когда задал вопрос.)

Причина, по которой я считаю, что -target 1.0 может работать, заключается в следующем: https://stackoverflow.com/a/26148408

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

TL; DR javac -target 1.1 (и без использования каких-либо классов или методов, которые были добавлены позже) заставит его работать на JDK> = 1.0.2 (выпущено в 1995-09-16).Невозможно вернуться назад еще, потому что более ранние JDK не являются общедоступными для попытки.

Значение флага javac -target ... влияет на младший (смещение байтов 4 и 5) и основной (смещение байтов 6 и 7)номер версии, хранящийся в файле .class:

  • javac -target 1.1 в JDK 1.8 создает версию 45.3, поддерживаемую JDK 1.0.2 (выпущена в 1995-09-16), JDK 1.1. * (выпущенав 1997-02), JDK> = 1.2 (выпущено в 1998-12).[ source ]
  • javac в JDK 1.0.2 (из jdk-1_0_2-win32-x86.exe, запуск с wine в Linux) генерирует версию 45.3.
  • Для k ≥2, JDK release 1.k поддерживает версии формата файлов классов в диапазоне от 45.0 до (44 + k) .0 включительно.[ source ]
  • javac -target 1.2 создает версию 46.0, поддерживаемую JDK> = 1.2.
  • javac -target 1.3 создает версию 47.0, поддерживаемую JDK> = 1.3.
  • javac -target 1.4 генерирует версию 48.0, поддерживаемую JDK> = 1.4.
  • и т. Д.
0 голосов
/ 10 февраля 2019

В Java 8 минимальная цель - JDK 1.1.В Java 9 минимальная цель была увеличена до JDK 1.6 (Java 6).

Хорошо, что вы пытаетесь сделать свой код совместимым с максимально возможным количеством версий Java, но, поскольку Java 6 не работает с 2015 года, на самом деле никто не должен пытаться писать новый код, который работает сJava 5 или старше.

РЕДАКТИРОВАТЬ: Кроме того, в Java 9 они добавили флаг --release в Javac, который является предпочтительным вариантом вместо -source и -target сейчас.По сути, --release 6 - это то же самое, что и -source 1.6 -target 1.6, но он также имеет дополнительное преимущество, заключающееся в настройке пути загрузки в сочетании с целевым выпуском, что является огромным удобством.На практике это защищает вас от установки --release 6 в компиляторе, но случайно использует некоторую новую функцию класса или языка из Java 7 или выше.

...