>source

Maven을 사용하여 작성된 Eclipse에서 Java 프로젝트에서 작업하고 있습니다. 이전 프로젝트에서 일부 재활용 code를 사용하고 있으며 이러한 클래스 중 하나는 파일을 찾습니다.META-INF /서비스특정 이름이있는 JAR 폴더는이 파일의 텍스트를 구문 분석합니다. 이 특정 예에서는 Java 인터페이스의 이름이있는 파일을 찾은 다음 파일 내부에서 구현의 클래스 이름을 가져옵니다.

그래서 기본적으로 내가하려는 것은 파일 이름 (x)이있는 JAR의 "Meta-inf /services"폴더에 파일을 포함하고 하나의 텍스트 (y) 나는 이것이 Maven을 사용해야한다고 생각하고있을 것입니다. 아마도 POM 파일의 속성을 지정하면 내 연구가 아무 것도 밝혀지지 않았습니다. 나는 당신이 하드 code를 보거나 메타 파일을 수동으로 입력하지 않아야한다는 것을 알고 있으므로 여기서 무엇을 해야할지 모르겠습니다.

8 년 후에 Meta-INF /Services 폴더를 인식 할 수있는 Maven 프로젝트를 얻는 것은 여전히 ​​매우 어렵습니다. 가능한 경우.

Gerry2021-09-15 04:18:13
  • 답변 # 1

    위치가 있습니다src /주 /자원, 그런 다음 당신을 만듭니다META-INF /서비스거기에있는 폴더와 정규화 된 클래스 이름 (FQCN) 파일에 놓습니다. 이것은 자동으로 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
    

    기본 소스 세트가있는 그라데이션 프로젝트에도 적용되는 것은 주목할 가치가 있습니다.

    이렇게하면 인터페이스의 모든 구현을 모두로드 할 수 있습니다.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());
    }
    

    참고 사항 :

    • 모든 구현에는 NO-ARGS 생성자가 있어야합니다
    • 모듈 또는 사용자 정의 클래스 로더를 사용하는 응용 프로그램은의 과부하를 사용해야합니다.serviceloader.load
    • 를로드합니다

    이러한 조건이 작동하지 않으면 다른 시스템으로 전환 할 수 있습니다. 봄, EJB 등과 같은 CDI 스타일의 프레임 워크 등

    서비스 폴더에 넣을 것인가?

    Ozan Kurt2021-09-14 07:11:01

    @ozankurt는 serviceLoader 클래스의 Javadoc을 살펴 보시기 바랍니다 : docs.oracle.com/javase/8/docs/api/java/util/serviceloader.html

    Puce2021-09-14 07:11:01

    @ 브리아 감사합니다! 그게 내가 많이 도왔다!

    andrbmgi2021-09-14 23:44:37

    메타 inf /services /com.acme.myinterface 또는 meta-inf /services /com /acme /myinterface?

    Gerry2021-09-15 04:18:13
  • 답변 # 2

    또는 프로젝트가 표준 디렉토리 구조를 사용하지 않으면 (또는 대체 리소스 디렉토리를 사용하기 만하면되기를 바란다) 지정할 수 있습니다. 자원 디렉토리수동으로 POM 파일.

    예를 들어META-INF /서비스호출 된 폴더에 있습니다자원프로젝트 디렉토리의 루트에있는 것은 다음과 같이 지정할 수 있습니다.

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

    이 옵션을 사용하여 여러 디렉토리를 추가하여 여러 디렉토리를 지정할 수 있습니다.< 자원 및 gt;집단.

    서비스 폴더에 넣을 것인가?

    Ozan Kurt2021-09-14 07:11:01

    @ozankurt 나는 거기에있는 모든 것을 확신하지 못하지만, 메타 inf /services에 삽입되는 파일의 한 예는 일반적으로 사용자 정의 charsetprovider입니다.

    Robert Bartlett-Schneider2021-09-14 07:11:01

    나는 이것을 얻었습니다. 주석을 추가해야했습니다. 감사 해요

    Ozan Kurt2021-09-14 07:11:01
  • 답변 # 3

    기본적으로 Maven은 다음에서 자원을 찾습니다.

    src/main/resources
    

    에 넣어 두십시오

    src/main/resources/META-INF/services
    

    서비스 폴더에 넣을 것인가?

    Ozan Kurt2021-09-14 07:11:01
  • 이전 javascript : node.js에서 오류가 발생한 문제를 해결하는 방법
  • 다음 ios : Xcode 11.3.1과 호환되는 마지막 플러터 버전은 무엇입니까?