Почему я не могу прочитать файл MANIFEST.MF, созданный maven при упаковке jar?

#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(…); свойства загрузки и т. Д. С моей точки зрения, плохая идея)