2016-07-08 6 views
9

Я создал два небольших проекты de.app1 и de.app2, где App из de.app1 используют Test из де .app2.Можно ли использовать зависимости без модуля-info.class в модуле Java 9

├── de.app1 
│   ├── de 
│   │   └── app 
│   │    └── App.java 
│   └── module-info.java 
└── de.app2 
    └── de 
       └── test 
        └── Test.java 

module-info.java в первом проекте содержит только module de.app1 {}

Я скомпилировал второй проект и создал банку файл:

javac de/test/Test.java 
jar cf app2.jar de/test/Test.class 

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

javac -cp ../de.app2/app2.jar de/app/App.java module-info.java 

не удалось, так как Test не найдено. Когда я скомпилирую проект без module-info.java, все работает как обычно.

Возможно ли использовать классы из jar, который не является модулем Java 9 в пределах модуля Java 9? Особенно для проектов, которые зависят от сторонних проектов (например, apache-commons, ...), я думаю, что что-то вроде этого потребуется.

ответ

9

Да, это возможно. То, что вы ищете, это automatic modules.

Чтобы создать просто положить регулярные JAR в папку, которую вы упоминаете на пути модуля (например, guava-19.0.jar в папке libs - см my example project). Это говорит JVM о создании модуля из него. Этот модуль получит имя на основе имени файла (в данном случае guava), прочитает все остальные модули и экспортирует все его пакеты.

Затем вы можете потребовать его с именем, которое оно было дано (например, require guava; - см. here).

+0

Ницца, спасибо! Итак, чтобы я понял это: когда я работаю с модулями, я должен в основном использовать путь к модулю вместо classpath? –

+1

Это не так просто. JVM будет загружать только модули из пути модуля, которые требуются другому модулю. Зависимости автоматических модулей не требуются никому (потому что у них нет 'module-info'), поэтому они не будут загружены. Они должны идти по пути класса, где они сгруппированы в [неназванный модуль] (http://openjdk.java.net/projects/jigsaw/spec/sotms/#the-unnamed-module). – Nicolai

+2

Если один автоматический модуль зависит от другого автоматического модуля (то есть, оба находятся на пути к модулю, но только первый требуется явным модулем ), то вы можете заставить второй автоматический модуль загружаться через ['- add-modules'] (http://openjdk.java.net/jeps/261#Root-modules) опция. Этот параметр принимает различные специальные токены, обозначающие полезные коллекции модулей. ['ALL-MODULE-PATH'] (http://openjdk.java.net/jeps/261#ALL-MODULE-PATH), в частности, загрузит все наблюдаемые модули, найденные на пути к модулю. –