#maven #manifest.mf #maven-war-plugin #servletcontextlistener #maven-jar-plugin
Вопрос:
У меня есть два отдельных проекта: один-spring-boot с упаковкой jar, а другой-приложение без пружинной загрузки с упаковкой war.
В моем приложении для весенней загрузки я использую плагин maven-jar для создания файла MANIFEST.MF с пользовательскими записями, такими как:
lt;plugingt; lt;artifactIdgt;maven-jar-pluginlt;/artifactIdgt; lt;versiongt;${maven.jar.version}lt;/versiongt; lt;configurationgt; lt;archivegt; lt;addMavenDescriptorgt;falselt;/addMavenDescriptorgt; lt;manifestgt; lt;addClasspathgt;truelt;/addClasspathgt; lt;classpathPrefixgt;lib/lt;/classpathPrefixgt; lt;addDefaultImplementationEntriesgt;truelt;/addDefaultImplementationEntriesgt; lt;packageNamegt;${project.artifactId}-${project.version}lt;/packageNamegt; lt;/manifestgt; lt;manifestEntriesgt; lt;Custom-Entrygt;someValuelt;/CustomEntrygt; lt;/manifestEntriesgt; lt;/archivegt; lt;/configurationgt; lt;/plugingt;
Во время выполнения, когда я пытаюсь получить манифест:
InputStrem is = this.getClass().getClassLoader().getResourceAsStream("META-INF/MANIFEST.MF");
Он не может найти мой манифест, вместо этого он берет первый произвольный манифест из другой банки (например, из банки лобмока). Я попытался перебрать все доступные манифесты в пути к классам, но, похоже, моих манифестов там нет. Но когда я сам создаю файл MANIFEST.MF resources/META-INF/
, я получаю правильный файл из getResourseAsStream()
Я не знаю, почему это происходит. Вероятно, потому, что манифест ищется не в файле jar, а в target/classes/META-INF.
Теперь, когда я работаю с другим приложением, которое заархивировано в war, и использую maven-war-плагин с точно такой же конфигурацией, он работает правильно. Но я не использую
this.getClass().getClassLoader().getResourceAsStream("META-INF/MANIFEST.MF")
Я использую
servletContext.getResourceAsInputStream("META-INF/MANIFEST.MF")
Итак, в принципе, дело в том, что мне нужно использовать ServletContext вместо загрузчика классов. Таким образом, я попытался обойти проблему в своем первом приложении для весенней загрузки и сделать что-то вроде:
@Autowired ServletContext sc; public void init() { sc.getResourceAsInputStream("META-INF/MANIFEST.MF"); }
Но опять же, он вернул значение null.
Я также попытался сделать следующее:
public CustomServletContextListener extends ServletContextListener { @Override public void contextInitialized(final ServletContextEvent event) { event.getServletContext().getResourseAsInputStream("META-INF/MANIFEST.MF"); } }
Тем не менее, это не так
Итак, я предполагаю, что проблема в формате архива. Что — то идет не так в приложении jar. Есть какие-нибудь идеи, что здесь на самом деле происходит?
Комментарии:
1. Сначала приложение spring boot создает специальный формат файла jar, который отличается от обычного формата jar. Это включает в себя также
MANIFEST.MF
файл.. кроме того, я хотел бы спросить, зачем вам нужна какая-то информация в вашемMANIFEST.MF
приложении для загрузки spring? (что-то вродеclasspathPrefix
) потому что загрузочный контейнер spring-это самостоятельный контейнер и исполняемый файл… ?2. Чтобы разобраться с наследием, конечно. Мне нужно получить пару пользовательских свойств из этого сгенерированного МАНИФЕСТА
3. Во-первых, нет смысла что-то делать в МАНИФЕСТЕ, потому что такие вещи являются application.properties весной … который может быть задан в командной строке… какие именно свойства… просто поместите
xyz.properties
файл,src/main/resources
и вы сможете прочитать их через `getResourcesAsStream(…); свойства загрузки и т. Д. С моей точки зрения, плохая идея)