Як включити конфігураційний файл до папки “META-INF / services” JAR за допомогою Maven


76

Я працюю над проектом Java в Eclipse, який побудований за допомогою Maven. Я використовую перероблений код із попереднього проекту, і один із цих класів шукає файл у META-INF/servicesпапці JAR з певним іменем, а потім аналізує текст цього файлу. У цьому конкретному прикладі він шукає файл з ім'ям інтерфейсу Java, а потім захоплює ім'я класу реалізації всередині файлу.

Отже, в основному те, що я намагаюся зробити, це включити файл у папку «META-INF / services» JAR із назвою файлу (X) та одним рядком тексту (Y) . Я гадаю, це слід робити за допомогою Maven, можливо, вказавши атрибут у файлі POM, але моє дослідження нічого не виявило. Я знаю, що вам не слід жорстко кодувати або вручну вводити будь-які META-файли, тому я не впевнений, що тут робити.

Відповіді:


124

Створіть нову вихідну папку з місцем розташування src/main/resources, потім створіть там свою META-INF/servicesпапку та опустіть файл FQCN. Це повинно автоматично скопіювати їх у файл jar. Отже, у вас буде:

Project
| src
| | main
|   | java
|     | [your source code]
|   | resources
|     | META-INF
|       | services
|         | [your service files]

Варто зазначити, що це стосується і проектів Gradle із наборами джерел за замовчуванням.


1
Що помістити в папку сервісів?
Озан Курт

2
@OzanKurt Будь ласка, подивіться на Javadoc класу ServiceLoader: docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html
Puce

2
@OzanKurt Ось пов'язаний шлях Java . Коротше кажучи, ім'я файлу всередині META-INF / services буде приблизно таким, як META-INF / services / com.acme.MyInterface, і воно буде містити кожен FQCN реалізацій у вашому додатку, кожен у новому рядку, наприкладcom.example.MyInterfaceImpl
Brian

Дякую @Brian! Це мені дуже допомогло!
andrbmgi

20

За замовчуванням Maven шукає ресурси за адресою:

src/main/resources

Тож поставте це

src/main/resources/META-INF/services

1
Що помістити в папку сервісів?
Озан Курт

16

Крім того, якщо ваш проект не використовує стандартну структуру каталогів (або ви просто хочете мати альтернативні каталоги ресурсів), ви можете вказати каталоги ресурсів вручну у файлі POM.

Наприклад, якщо ваш файл META-INF/servicesзнаходиться в папці, resourcesяка називається в кореневій директорії вашого проекту, ви можете вказати це наступним чином:

<project>
...
  <build>
    ...
    <resources>
      <resource>
        <directory>resources</directory>
      </resource>
    </resources>
    ...
  </build>
  ...
</project>

Ви можете використовувати це, щоб вказати кілька каталогів, додавши кілька <resource>елементів.


Що помістити в папку сервісів?
Озан Курт

@OzanKurt Я не впевнений у всьому, що там є, але одним із прикладів файлу, який живе в META-INF / сервісах, зазвичай є спеціальний CharsetProvider.
Роберт Бартлетт-Шнайдер

1
Я отримав це, потрібно було додати анотації. Дякую
Озан Курт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.