Проблема миграции Java 9 - пакет com.mymodule объявлен в безымянном модуле, модуль newmodule не читает его

Я создал многомодульный проект со следующей структурой

    myproject
      |- mymodule
         |- src
            |- main
               |- java
                  |- com
                     |- mymodule
                        |- Util.java

      |-newmodule
         |-src
           |-main
             |-java
               |-com
                 |-newmodule
                    |- Main.java
             |-module-info.java

Теперь я хочу использовать Util.java, который представляет собой немодульный код в модульном модуле newmodule. я заявил следующее в новом модуле

module newmodule {
    requires mymodule;
}

Проект компилируется нормально, но Intellij показывает, что модуль не найден, а пакет com.mymodule объявлен в безымянном модуле, модуль newmodule его не читает.

Как решить эту проблему?

И еще один вопрос: весь старый немодульный код по умолчанию превращается в автоматический модуль в java 9, если я даже не модулирую устаревшие модули?


person learner    schedule 17.08.2018    source источник
comment
случайно, это подмодули maven? и оба они скомпилированы с использованием IntelliJ? Причина, по которой я спрашиваю об этом, заключается в том, что один из очевидных способов решить эту проблему - сделать mymodule явным модулем с module-info.java в нем (также экспортирует пакет).   -  person Naman    schedule 17.08.2018
comment
Привет, На самом деле я не хочу разбивать модуль с именем mymodule, так как это устаревший код. но я хочу использовать Util.java из mymodule в newmodule, который является модульным. И да, это проект maven, и я также объявил автоматическое имя модуля для mymodule в его pom.xml. Извините, я забыл упомянуть об этом раньше.   -  person learner    schedule 17.08.2018


Ответы (1)


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

Вы можете сделать это, включив module-info.java в mymodule, например:

module mymodule {
    exports com.mymodule;
}

весь старый немодульный код по умолчанию превращается в автоматический модуль в java 9, если я даже не модулирую устаревшие модули?

Концепция как безымянного модуля, так и автоматического модуля состоит в том, чтобы облегчить миграцию и обеспечить совместимость с существующими методами пути к классам.

С одной стороны, зависимости вашего модуля, которые по-прежнему не являются модульными, и вы все равно полагаетесь на них как на единицу, могут использоваться в пути к модулю для системы модулей. неявно определять их, когда они рассматриваются как автоматические модули и мост восходящая миграция, ожидаемая JPMS.

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


Причина, по которой вы не смогли бы объявить явную зависимость в своем коде, четко указана в документе: -

Безымянный модуль экспортирует все свои пакеты. Это обеспечивает гибкую миграцию, как мы увидим ниже. Однако это не означает, что код в именованном модуле может обращаться к типам в безымянном модуле. Именованный модуль фактически не может даже объявить зависимость от безымянного модуля. Это ограничение является преднамеренным, поскольку разрешение именованным модулям зависеть от произвольного содержимого пути к классам сделает надежную настройку невозможной.

person Naman    schedule 17.08.2018
comment
хорошо, итак. если я хочу использовать свой немодульный устаревший код в качестве утилиты в моем новом модульном коде, я не смогу использовать его, как это определено в безымянном модуле. Но если я хочу сделать этот устаревший код автоматическим модулем, не выполняя модуляризацию. Тогда как это сделать? - person learner; 17.08.2018
comment
И как Java определила модуль как автоматический модуль? Как я знаю, java принимает имя автоматического модуля, если упомянуто, иначе создает имя из файла jar. Итак, как он узнает, что он считается автоматическим модулем? - person learner; 17.08.2018
comment
@ user10237300 Самый простой способ, который я знаю, - это создать банку из вашего существующего кода и представить это как зависимость от вашего модульного кода. Откуда JPMS знает ... подробно объясняется в ссылке, предоставленной в ответе. Чтобы убедиться, что артефакт используется с правильным автоматическим именем модуля, см. этот ответ от меня. - person Naman; 17.08.2018
comment
Хорошо .. так что в основном, если я упомяну имя автоматического модуля в pom.xml (mymodule) в maven-jar-plugin и упомяну зависимость maven в pom.xml new_module, который фактически является модульным, тогда mymodule должен быть импортирован как автоматический модуль в new_module. Верно ли мое мнение? Большое вам спасибо за вашу помощь. Поскольку я сделал то же самое в своем проекте, о котором я упоминал ранее, он отлично компилировался через cmd, но через intellij он выдает ошибку. - person learner; 17.08.2018
comment
Таким образом, в основном каждый старый устаревший код из безымянного модуля будет превращен в автоматический модуль, если я упомянул, что я делаю запись в манифесте при создании файла jar? - person learner; 17.08.2018
comment
Таким образом, в основном каждый старый устаревший код из безымянного модуля будет превращен в автоматический модуль, если я упомянул, что я делаю запись в манифесте при создании файла jar ... только когда этот файл jar доступен в пути к модулю ваше приложение полагается на это. - person Naman; 17.08.2018
comment
упомяните зависимость maven в pom.xml new_module, который фактически является модульным, тогда mymodule должен быть импортирован как automatic-module в new_module. Верно ли мое мнение? ... правильно, если вы явно не сделали это mymodule как модульное приложение. - person Naman; 17.08.2018
comment
У меня есть еще одно сомнение, если я не упомяну автоматическое имя модуля в манифесте, тогда также jar импортируется как автоматический модуль в модульное приложение. Тогда в чем разница между автоматическим модулем и безымянным? Достаточно ли упоминания в манифесте, чтобы немодульный модуль работал со многими модульными? - person learner; 18.08.2018
comment
@ user10237300 Jar на пути к модулю в любом случае будет рассматриваться как автоматический модуль, просто запись в манифесте будет определенным способом объявления чего-то вроде это будет имя моего модуля всякий раз, когда он становится модульным .. В противном случае система модулей по-прежнему будет пытаться получить имя из имени jar-файла. И разница между безымянным модулем и автоматическим модулем четко указана в ответе, пожалуйста, перечитайте. Я предлагаю понять документ, связанный с ответом, который поможет вам понять концепцию. - person Naman; 18.08.2018
comment
спасибо за вашу помощь, но мои сомнения все еще не развеялись. Если у меня есть немодульный код и один модульный код, который зависит от немодульного, то как я могу превратить немодульный код в автоматический модуль, чтобы я мог использовать его в модульном коде. Я понимаю, что если я даже не упомяну, что в манифесте для плагина jar jdk автоматически выведет имя модуля, но как это сделать через maven? как разместить его на пути к модулю через maven? На самом деле я не хочу делать это из cmd. Используя maven, я получаю сообщение об ошибке через intellij .. Пожалуйста, помогите. - person learner; 18.08.2018
comment
но как это сделать через maven? .. просто включите немодульный код в качестве зависимости в модульный код pom.xml ... * как разместить его на пути модуля через maven? *. .. в вашем модульном коде, как только вы введете module-info.java, вы получите зависимости от пути к модулю ... и в идеале, когда вы столкнетесь с какой-либо проблемой, вы должны открыть другой поток в StackOverflow :), если текущие сомнения были устранены ответ, предложил бы принять ответ, а затем продолжить и попробовать что-то еще. - person Naman; 18.08.2018
comment
Да, теперь мои сомнения ясны. Большое спасибо. Но да, столкнулся с другой проблемой. Открою тему различий. - person learner; 18.08.2018