Как получить все пакеты java-приложения?

Есть ли способ получить все пакеты, связанные с моим приложением, во время выполнения? (например, список строк)

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

Я попытался найти их по основному классу:

System.getProperty("sun.java.command")

Но в этом случае я могу получить только пакет своего основного класса.

Я предполагаю, что это может отличаться от приложения и того, как оно упаковано. Но сейчас я в основном работаю с приложениями Spring Boot, которые упакованы как банка.

Возможно, это проблема XY?

jaco0646 22.01.2019 20:15

@NathanHughes, это может сработать. Но я надеюсь, что может быть более элегантное решение, чем обход zip.

dvelopp 22.01.2019 20:18

@ jaco0646, вопрос в первой строке. Я просто сделал заметку о том, что мне удалось сделать до сих пор.

dvelopp 22.01.2019 20:18

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

jaco0646 22.01.2019 20:23

Да, причина, по которой мне это нужно, заключается в том, что я хочу использовать в java-агенте все классы только моих пакетов. Вот почему мне нужен этот список пакетов.

dvelopp 22.01.2019 20:25

проверь мой ответ @dvelopp

Deadpool 22.01.2019 20:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
215
1

Ответы 1

Вы должны попробовать таким образом, указать пакет основного класса и сделать фильтр

пакет основного класса весенней загрузкиcom.main

Package[] p = Package.getPackages();

    for(Package p1 : p) {
        if (p1.getName().startsWith("com.main"))
            System.out.println(p1.getName());
    }

Некоторые приложения имеют два и более совершенно разных пакета одновременно. например com.dvelopp.app (там основной класс) и com.company.utils (есть какие-то утилиты, которые есть у меня в проекте) В этом случае проходится единственная ветка com.dvelopp.app, верно?

dvelopp 22.01.2019 20:29

затем проверьте startsWith("com.dvelopp") или startsWith("com.company"), но в основном при весенней загрузке все пакеты должны подпадать под пакет основного класса, верно? я имею в виду, что кажется ясным @dvelopp

Deadpool 22.01.2019 20:32

Это применимо к компонентам Spring. Классы, управляемые не Spring, могут быть в разных пакетах (это может быть не очень круто, но все же). Но в данном случае мы еще не знаем о существовании "com.company". В любом случае, ответ очень хороший, но все же у нас есть случаи, которые этот подход не покрывает.

dvelopp 22.01.2019 20:36

мне интересно узнать, не майните ли вы @dvelopp

Deadpool 22.01.2019 20:38

В основном я имею в виду, что он не находит пакеты за пределами основного класса.

dvelopp 22.01.2019 20:41

ты пытался? у меня это сработало, он нашел все пакеты в моем весеннем загрузочном приложении @dvelopp

Deadpool 22.01.2019 20:43

Да, он находит все пакеты весеннего загрузочного приложения. Но здесь мы проверяем, имеют ли они тот же корневой путь, что и пакет с основным классом (p1.getName().startsWith("com.main")), но что, если некоторые из моих классов не находятся в com.main? мы не справляемся с этим.

dvelopp 22.01.2019 20:58

Если есть разные структуры, почему бы не добавить пару условий фильтрации? можете ли вы добавить свою структуру пакета, я просто хочу увидеть @dvelopp

Deadpool 22.01.2019 21:03

Как я уже упоминал, этот код находится в java-агенте. Он должен быть общим и ничего не знать о структуре моих пакетов. Это должно быть в состоянии прочитать это. С помощью вашего кода и System.getProperty("sun.java.command") я могу найти пакеты, которые имеют тот же корень, что и основной класс для всех приложений. Это общее. Но только потому, что он общий, я не могу добавить startWith("com.company"), потому что тогда он не будет общим

dvelopp 22.01.2019 21:13

Другие вопросы по теме