Прочитайте версию фляги для класса - PullRequest
0 голосов
/ 08 ноября 2019

Для клиента веб-сервиса я хотел бы использовать реализацию-заголовок и реализацию-версию из файла jar в качестве строки агента пользователя. Вопрос в том, как прочитать манифест кувшина.

Этот вопрос задавался несколько раз, однако мне кажется, что ответ не применим. (например, Чтение моего собственного манифеста Jar )

Проблема в том, что простое чтение /META-INF/MANIFEST.MF почти всегда дает неверные результаты. В моем случае это почти всегда относится к JBoss.

Решение, предложенное в https://stackoverflow.com/a/1273196/4222206, проблематично для меня, так как вам придется жестко закодировать имя библиотеки, чтобы остановить итерацию, а затем все равноэто может означать, что две версии одной и той же библиотеки находятся в пути к классам, и вы просто возвращаете первый - не обязательно правильный - хит.

Решение в https://stackoverflow.com/a/1273432/4222206, похоже, работает с jar: //Только URL-адреса, которые полностью терпят неудачу в JBoss, где загрузчик классов приложения создает vfs: // urls.

Есть ли способ для кода в классе найти свой манифест?

Я пробовал вышеупомянутые элементыкоторые кажутся хорошо работающими в небольших приложениях, запускаемых из командной строки java, но тогда я хотел бы иметь переносимое решение, так как не могу предсказать, где моя библиотека будет использоваться позже.

public static Manifest getManifest() {
    log.debug("getManifest()");
    synchronized(Version.class) {
        if(manifest==null) {
            try {
                // this works wrongly in JBoss
                //ClassLoader cl = Version.class.getProtectionDomain().getClassLoader();
                //log.debug("found classloader={}", cl);
                //URL manifesturl = cl.getResource("/META-INF/MANIFEST.MF");

                URL jar = Version.class.getProtectionDomain().getCodeSource().getLocation();
                log.debug("Class loaded from {}", jar);

                URL manifesturl = null;
                switch(jar.getProtocol()) {
                    case "file":
                        manifesturl = new URL(jar.toString()+"META-INF/MANIFEST.MF");
                        break;
                    default:
                        manifesturl = new URL(jar.toString()+"!/META-INF/MANIFEST.MF");
                }


                log.debug("Expecting manifest at {}", manifesturl);
                manifest = new Manifest(manifesturl.openStream());
            }
            catch(Exception e) {
                log.info("Could not read version", e);
            }
        }
    }

Код обнаружитправильный путь кувшина. Я предположил, что изменение URL-адреса, указывающего на манифест, даст требуемый результат, однако я получаю следующее:

Class loaded from vfs:/C:/Users/user/Documents/JavaLibs/wildfly-18.0.0.Final/bin/content/webapp.war/WEB-INF/lib/library-1.0-18.jar
Expecting manifest at vfs:/C:/Users/user/Documents/JavaLibs/wildfly-18.0.0.Final/bin/content/webapp.war/WEB-INF/lib/library-1.0-18.jar!/META-INF/MANIFEST.MF
Could not read version: java.io.FileNotFoundException: C:\Users\hiran\Documents\JavaLibs\wildfly-18.0.0.Final\standalone\tmp\vfs\temp\tempfc75b13f07296e98\content-e4d5ca96cbe6b35e\WEB-INF\lib\library-1.0-18.jar!\META-INF\MANIFEST.MF (The system cannot find the path specified)

Я проверил этот путь, и кажется, что даже первый URL-адрес к банке (полученный через Version.class.getProtectionDomain (). getCodeSource (). getLocation ()) уже ошибся. Это должен был быть C: \ Users \ user \ Documents \ JavaLibs \ wildfly-18.0.0.Final \ standalone \ tmp \ vfs \ temp \ tempfc75b13f07296e98 \ content-e4d5ca96cbe6b35e \ WEB-INF \ lib \ library-1.0.18.jar.

То есть это может указывать на проблему в Wildfly?

1 Ответ

0 голосов
/ 11 ноября 2019

Кажется, я нашел здесь подходящее решение: https://stackoverflow.com/a/37325538/4222206

Таким образом, в конце этот код может отображать правильную версию банки (как минимум) в JBoss:

this.getClass().getPackage().getImplementationTitle();
this.getClass().getPackage().getImplementationVersion();

Надеюсь, я найду этот ответ, когда буду искать в следующий раз ...

...