Можно ли смешивать исходный код Java 8 и Java 9 в одном проекте без использования флагов компилятора?

В Java 9 вы можете опционально упаковать исходный каталог в качестве модуля, добавив файл module-info.java, который определяет пакеты вещей, которые он экспортирует, и от каких других модулей он зависит.

Однако, как только вы это сделаете, вы должны перечислить ВСЕ зависимости в дескрипторе модуля, и все зависимости должны быть модулями. Таким образом, если вы разбиваете на модули один исходный каталог, вы должны разбивать на модули каждую отдельную исходную директорию в масштабе всей компании.

Кроме того, вы не можете определять модули в Java 8 или более ранних версиях, а это означает, что в дополнение к модуляции каждого исходного каталога Java вы должны преобразовать все в Java 9. В то же время.

Это кажется катастрофой, если вы работаете в компании с большой базой кода, которая используется во множестве разных проектов.

На данный момент я могу обойти проблему, просто установив несколько флагов компилятора, чтобы избежать определения модулей, но это кажется очень плохим решением.

Надеюсь, я неправильно это понимаю?


person Jesse Barnum    schedule 17.11.2017    source источник


Ответы (2)


Однако, как только вы это сделаете, вы должны перечислить ВСЕ зависимости в дескрипторе модуля.

Истинный.

и все зависимости должны быть модулями.

Технически верно, но это не означает, что вы думаете, что он делает.

Таким образом, если вы разбиваете на модули один исходный каталог, вы должны разбивать на модули каждую отдельную исходную директорию в масштабе всей компании.

Нет, потому что вы можете позволить модульной системе превращать обычные старые JAR-файлы в автоматические модули., который получит имя на основе записи манифеста или имени файла — это можно узнать с помощью:

# jar command from Java 9
jar --describe-module --file $JAR_FILE

Кроме того, вы не можете определять модули в Java 8 или более ранних версиях, а это означает, что в дополнение к модуляции каждого исходного каталога Java вы должны преобразовать все в Java 9. В то же время.

Опять же, к счастью, это не совсем так. Вы можете добавить module-info.class в JAR, созданный для Java 8, и он будет работать как на Java 8 (который игнорирует этот файл), так и на Java 9 (который, конечно, может выполнять байт-код Java 8).

person Nicolai Parlog    schedule 17.11.2017

если вы разбиваете на модули один исходный каталог, вы должны разбивать на модули каждый отдельный исходный каталог в масштабах всей компании.

Нет, это не соответствует действительности, поскольку автоматические модули предназначены для

(поддерживая импульс) Да, в конечном счете, это будет целью модуляризации.


Повторяем необходимость введения автоматических модулей из отчета «Состояние модульной системы»:

Миграция снизу вверх проста, но не всегда возможна. Даже если сопровождающий org-baz-qux.jar еще не преобразовал его в надлежащий модуль — или, возможно, никогда не сделает — мы все равно можем захотеть модульизовать наши компоненты com-foo-app.jar и com-foo-bar.jar.


Когда вы на самом деле говорите:

вы можете дополнительно упаковать исходный каталог как модуль, добавив module-info.java

вы, как правило, переносите этот артефакт в модуль (с описанием модуля) и помещаете такие модули в путь к модулю библиотек, использующих этот артефакт в дальнейшем.

С другой стороны, .jar вашей библиотеки без module-info.class считается присутствующим в пути к классам при включении в качестве зависимости в последующие проекты.


Изменить из комментариев:-

можно смешивать исходный код Java 9 с скомпилированными jar-файлами Java 8, но вы не можете скомпилировать один проект, содержащий исходный код Java 9 и исходный код Java 8?

Да, можно смешивать исходный код Java9 с JAR-файлом компиляции Java8, и вы также можете скомпилировать их в один проект.

Пример: посмотрите, как Maven делает это с помощью maven-compiler-plugin для проектов Java8 с включенным module-info.java.

person Naman    schedule 17.11.2017
comment
Работает ли автоматическая подготовка модулей для компиляции исходного кода или нам нужно создавать скомпилированные jar-файлы для всего нашего общего кода? - person Jesse Barnum; 17.11.2017
comment
автоматический модуль создает артефакты в пути к классам ваших нижестоящих проектов. Не обязательно (если вы придерживаетесь этого предположения) генерировать информацию о модуле для любого jar-файла, который будет включен в качестве зависимости проекта, который вы переносите на java9. В этом случае нужно рассматривать такие зависимости как автоматические модули. - person Naman; 18.11.2017
comment
Подводя итог, можно смешивать исходный код Java 9 с скомпилированными jar-файлами Java 8, но вы не можете скомпилировать один проект, содержащий исходный код Java 9 и исходный код Java 8? - person Jesse Barnum; 18.11.2017
comment
можно смешивать исходный код Java 9 с скомпилированными jar-файлами Java 8... Да. .. вы не можете скомпилировать один проект, содержащий исходный код Java 9 и исходный код Java 8? ..Нет, вы не можете скомпилировать проект с обоими классами версий Java. - person Naman; 18.11.2017
comment
Спасибо за объяснение, хотя это действительно, очень разочаровывает. Все наши общие библиотеки кода в настоящее время находятся на Java 8, и перспектива необходимости работать с скомпилированными jar-файлами для кода Java 8 вместо прямого изменения исходного кода и сборки всего проекта — огромный шаг назад с точки зрения производительности. - person Jesse Barnum; 18.11.2017
comment
@JesseBarnum В таких случаях вы можете использовать существующие библиотеки на основе Java8 в качестве автоматических модулей и нацеливаться на использование многорелизных jar-файлов, поддерживаемых в Java9, что было бы полезно для компиляции вашего кода для обеих версий Java по мере необходимости. - person Naman; 18.11.2017
comment
Спасибо тебе за твое терпение. Я думаю, что мы здесь немного говорим друг о друге - я чувствую, что вы говорите, что я могу скомпилировать java8libraryA.jar, java8libraryB.jar, затем поместить их в путь к классам и использовать это для компиляции java9application.jar. Но то, что я хочу сделать, это просто иметь возможность напрямую изменять весь мой исходный код java 8 и java 9, а затем компилировать в один файл java8and9application.jar. - person Jesse Barnum; 18.11.2017
comment
@JesseBarnum что я хочу сделать, так это просто иметь возможность напрямую изменять весь мой исходный код java 8 и java 9, а затем компилировать в один файл java8and9application.jar .. что оставляет меня немного озадаченным. ... вы хотите поместить все библиотеки в одну банку? Учитывая, что java9application, java8libraryA и java8libraryB — это разные исходные коды, которыми вы управляете. Чего на самом деле вы пытаетесь достичь там? - person Naman; 18.11.2017
comment
Вы хотите поместить все библиотеки в одну банку? Да, это будет мой последний вывод. Препятствием для быстрой разработки является необходимость компилировать исходный код в файл jar перед включением его в проект. Я не рассматриваю их как статические библиотеки, все они быстро модифицируются в процессе разработки. - person Jesse Barnum; 18.11.2017
comment
Давайте продолжим обсуждение в чате. - person Naman; 18.11.2017
comment
@JesseBarnum В исходном вопросе на самом деле не указано, что я хочу сделать, это напрямую изменить код java 8 и java 9 и скомпилировать его в один файл java8and9application.jar. ИМХО, исходный вопрос вообще не ясен. - person Michael Easter; 21.11.2017