programing

메이븐을 사용하여 JAR의 "META-INF/services" 폴더에 구성 파일을 포함하는 방법

telebox 2023. 5. 12. 22:04
반응형

메이븐을 사용하여 JAR의 "META-INF/services" 폴더에 구성 파일을 포함하는 방법

저는 메이븐을 이용하여 만든 이클립스의 자바 프로젝트를 진행하고 있습니다.이전 프로젝트의 재활용 코드를 사용하고 있는데, 이 클래스 중 하나가 파일을 찾습니다.META-INF/services특정 이름을 가진 JAR의 폴더를 선택한 다음 이 파일의 텍스트를 구문 분석합니다.이 예제에서는 Java 인터페이스의 이름을 가진 파일을 찾은 다음 파일 내부에서 구현의 클래스 이름을 가져옵니다.

따라서 기본적으로 제가 하려는 것은 JAR의 "METa-INF/services" 폴더에 파일 이름(X)과 텍스트 한 줄(Y)을 포함하는 것입니다.메이븐을 이용해서 해야 할 것 같아요, 아마도 POM 파일에 속성을 지정해서요, 하지만 제 연구는 아무것도 발견하지 못했습니다.메타 파일을 하드 코딩하거나 수동으로 타이핑해서는 안 된다는 것을 알고 있습니다. 그래서 여기서 무엇을 해야 할지 모르겠습니다.

위치를 사용하여 새 원본 폴더 만들기src/main/resources그런 다음 당신의META-INF/services폴더를 저장하고 FQCN(Full-Qualified Class Name) 파일을 저장합니다.그러면 자동으로 jar 파일에 복사됩니다.따라서 FQCN을 사용하는 인터페이스 구현의 경우com.acme.MyInterface다음과 같은 이점이 있습니다.

Project
| src
| | main
|   | java
|     | [your source code]
|   | resources
|     | META-INF
|       | services
|         | com.acme.MyInterface

참고:com.acme.MyInterface는 파일의 이름이며 Java 패키지와 같은 디렉터리 구조가 아닙니다.파일의 이름은 구현 중인 인터페이스의 FQCN이며, 각 구현의 FQCN은 다음과 같이 고유한 줄에 표시됩니다.

com.example.MyInterfaceImpl
com.example.AnotherMyInterfaceImpl

이는 기본 소스 세트가 있는 Gradle 프로젝트에도 적용됩니다.

이렇게 하면 다음을 사용하여 인터페이스의 모든 구현을 로드할 수 있습니다.ServiceLoader:

ServiceLoader<MyInterface> loader = ServiceLoader.load(MyInterface.class);
for (MyInterface service : loader) {
    // Prints com.example.MyInterfaceImpl and com.example.AnotherMyInterfaceImpl
    System.out.println(service.class.getName());
}

주의할 사항:

  • 모든 구현에는 인수가 없는 생성자가 있어야 합니다.
  • 모듈 또는 사용자 지정 클래스 로더를 사용하는 애플리케이션은 다음의 오버로드를 사용해야 할 수 있습니다.ServiceLoader.load

이러한 조건이 적용되지 않을 경우 다른 시스템(예: Spring, EJB 등)으로 전환하는 것이 좋습니다.

기본적으로 Maven은 다음 위치에서 리소스를 찾습니다.

src/main/resources

그러니까 두자.

src/main/resources/META-INF/services

또는 프로젝트에서 표준 디렉터리 구조를 사용하지 않거나 대체 리소스 디렉터리를 사용하려는 경우 POM 파일을 수동으로 지정할 수 있습니다.

를 들어, 당신의 를들어당이, ▁your이.META-INF/services는 라는폴있다니라는 .resources다음과 같이 지정할 수 있는 루트 디렉터리는 다음과 같이 지정할 수 있습니다.

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

하여 여러 하여 여러 디렉터리를 할 수 .<resource>요소들.

언급URL : https://stackoverflow.com/questions/17531625/how-to-include-a-config-file-in-the-meta-inf-services-folder-of-a-jar-using-ma

반응형