Для клиента веб-сервиса я хотел бы использовать реализацию-заголовок и реализацию-версию из файла 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?