Сделайте классы общедоступными, но оставайтесь закрытыми для файла JAR - PullRequest
0 голосов
/ 11 февраля 2019

Есть ли способ сделать класс Java общедоступным, но только общедоступным с файлом JAR?AKA, это не приватный пакет, а публичный пакет, но не публичный JAR?

Скажите, у меня есть такая структура:

project/
  package1/
    One.java
  package2/
    Two.java
  package3/
    Three.java

Так как 3 файла .java находятся в разных файлахпакеты, мне нужно сделать вещи публичными.Но есть ли способ сделать их доступными только для JAR, который будет содержать проект?Так что, если другой проект импортирует JAR, он не может видеть определенные публичные классы / поля?

Ответы [ 3 ]

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

Используя проект Jigsaw в Java 9, вы можете делать именно то, где вы можете выбрать пакеты, которые вы хотите экспортировать.Например:

module com.yourproject {
  exports com.yourproject.package1;
}

Это обеспечит экспорт только package1.

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

Указанный уже существующими ответами, способ приспособиться к этому - модуляризация вашего кода (добавление объявления модуля с module-info.java для начала).Просто детализировать их со ссылкой на sotms # module-объявление

exports можно добавить, чтобы объявить, что модуль создает все и только типы publicв определенных пакетах, доступных для использования другими модулями:

module com.foo.bar {
    requires org.baz.qux;
    exports com.foo.bar.alpha;
    exports com.foo.bar.beta; 
} 

Если декларация модуля содержит нет пунктов экспорта , тогда не будет экспортировать какие-либо типы ввсе остальные модули .

и из раздела JLS Экспортированные и открытые пакеты

В директиве exports указано имяпакета, который будет экспортирован текущим модулем.Для кода в других модулях это дает доступ во время компиляции и во время выполнения к типам public и protected в пакете, а также к членам public и protected этих типов (§6.6).Он также предоставляет отражающий доступ к этим типам и членам для кода в других модулях.

и, кроме того, относится к квалифицированному и неквалифицированному экспорту ...

Для квалифицированной директивы:открытые и защищенные типы в пакете, а также их открытые и защищенные члены доступны только для кода в модулях, указанных в предложении to.Модули, указанные в предложении to, называются друзьями текущего модуля.Для неквалифицированной директивы эти типы и их члены доступны для кода в любом модуле.

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

Да, в Java 9 представлены модули, предназначенные для решения подобных проблем.

...