Есть ли способ получить все пакеты, связанные с моим приложением, во время выполнения? (например, список строк)
Меня интересуют только пакеты, которые объявлены в моем приложении, и не интересуют те, которые исходят из зависимостей.
Я попытался найти их по основному классу:
System.getProperty("sun.java.command")
Но в этом случае я могу получить только пакет своего основного класса.
Я предполагаю, что это может отличаться от приложения и того, как оно упаковано. Но сейчас я в основном работаю с приложениями Spring Boot, которые упакованы как банка.
@NathanHughes, это может сработать. Но я надеюсь, что может быть более элегантное решение, чем обход zip.
@ jaco0646, вопрос в первой строке. Я просто сделал заметку о том, что мне удалось сделать до сих пор.
Что я был добраться до, так это то, что, не зная, зачем вам нужен список имен пакетов, это пахнет недостатком дизайна. В идеале есть лучший дизайн, в котором вам это не нужно.
Да, причина, по которой мне это нужно, заключается в том, что я хочу использовать в java-агенте все классы только моих пакетов. Вот почему мне нужен этот список пакетов.
проверь мой ответ @dvelopp




Вы должны попробовать таким образом, указать пакет основного класса и сделать фильтр
пакет основного класса весенней загрузки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, верно?
затем проверьте startsWith("com.dvelopp") или startsWith("com.company"), но в основном при весенней загрузке все пакеты должны подпадать под пакет основного класса, верно? я имею в виду, что кажется ясным @dvelopp
Это применимо к компонентам Spring. Классы, управляемые не Spring, могут быть в разных пакетах (это может быть не очень круто, но все же). Но в данном случае мы еще не знаем о существовании "com.company". В любом случае, ответ очень хороший, но все же у нас есть случаи, которые этот подход не покрывает.
мне интересно узнать, не майните ли вы @dvelopp
В основном я имею в виду, что он не находит пакеты за пределами основного класса.
ты пытался? у меня это сработало, он нашел все пакеты в моем весеннем загрузочном приложении @dvelopp
Да, он находит все пакеты весеннего загрузочного приложения. Но здесь мы проверяем, имеют ли они тот же корневой путь, что и пакет с основным классом (p1.getName().startsWith("com.main")), но что, если некоторые из моих классов не находятся в com.main? мы не справляемся с этим.
Если есть разные структуры, почему бы не добавить пару условий фильтрации? можете ли вы добавить свою структуру пакета, я просто хочу увидеть @dvelopp
Как я уже упоминал, этот код находится в java-агенте. Он должен быть общим и ничего не знать о структуре моих пакетов. Это должно быть в состоянии прочитать это. С помощью вашего кода и System.getProperty("sun.java.command") я могу найти пакеты, которые имеют тот же корень, что и основной класс для всех приложений. Это общее. Но только потому, что он общий, я не могу добавить startWith("com.company"), потому что тогда он не будет общим
Возможно, это проблема XY?