скрыть какой-нибудь файл класса или пакет в jar-файле - PullRequest
2 голосов
/ 03 декабря 2010

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

Ответы [ 4 ]

3 голосов
/ 03 декабря 2010

Это не имеет большого смысла.

Если классы необходимы для компиляции проекта, то, вероятно, существуют статические зависимости от них в других классах. (В противном случае ... вы могли бы просто удалить его / их.)

Но если есть статические зависимости от этих классов, вы не сможете запускать приложения, если эти классы не присутствуют в файле JAR. Если вы оставите классы вне JAR, чтобы люди не использовали их (или что-то еще), ваше приложение умрет при запуске с исключениями «класс не найден».

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

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

  • Измените свой проект так, чтобы зависимости от классов были полностью динамическими; например через Class.forName(...) или внедрение зависимостей. Затем вы можете исключить классы из JAR по мере необходимости. Но еще раз: если вашему приложению нужно использовать классы, они должны быть доступны во время выполнения (каким-то образом), и поэтому другие люди смогут (каким-то образом) овладеть ими.

  • Измените свой проект, чтобы позволить вам полностью удалить классы. Это единственное надежное решение.

Наконец, прежде чем приступить ко всем этим неприятностям, вы должны спросить себя, почему вы вообще пытаетесь это делать. Почему бы вам просто не позволить людям использовать классы в любом случае? Что мешает им получать классы откуда-то еще ... или реализовывать свои собственные версии с нуля?

2 голосов
/ 03 декабря 2010

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

Вы можете поместить классы в пакет, который имеет в своем имени что-то вроде «internal» - например, com.example.internal - чтобы указать, что классы не предназначены для других, чтобы использовать или полагаться на них. Он не может помешать кому-либо использовать ваш класс в своих собственных целях, но это по крайней мере указывает на то, что они делают это на свой страх и риск, что ваши внутренние интерфейсы могут измениться в будущих версиях программы и т. Д.

1 голос
/ 03 декабря 2010

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

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

0 голосов
/ 03 декабря 2010

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

Или просто примите тот факт, что, поскольку код где-то там, любое количество запутывания является просто неудобством для всех и не может ничего скрыть.

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