2016-06-09 5 views
4

Java Jersey 프레임 워크 (Maven 사용)를 사용 중이고 IntelliJ를 IDE로 사용하고 있습니다. 이상한 IntelliJ 내에서 실행될 때만 maven을 사용하여 컴파일하고 java -jar를 사용하여 명령 줄에서 코드를 실행하려고 할 때만 발생하는이 런타임 예외가 발생했습니다. MessageBodyProviderNotFoundException 명령 줄에서 jar를 실행하는 중

좀 롬복 POJO로 반환 된 JSON을 읽을 일부 원격 URL에서 HTTP GET을 만들려고 시도하는 몇 가지 자바 코드가 있습니다

String targetUrl = "some valid URL"; 

WebTarget webTarget = client.target(targetUrl); 

Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).get(); 

ParseResponse parseResponse = response.readEntity(ParseResponse.class); 

내가 왜 확실하지 않다, 그러나 그것은 칠 때 은 "readEntity()"방법을 수행하는 마지막 줄에, 나는 아래의 오류가 발생합니다 :

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/json; charset=utf-8 

나는 확실히 저지 미디어 - JSON - 잭슨 의존성 내 pom.xml 파일에 지정된 때문에이이 이상하다 :

(210)
<dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-json-jackson</artifactId> 
     <version>2.23</version> 
</dependency> 

이 내가에 readEntity()에려고 내 POJO 클래스입니다 :

@Data 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class ParseResponse { 

    @JsonProperty("id") 
    private Integer id; 

    ...Other params... 
} 

그리고 내가 전에 언급처럼, 내가 명령 줄에서 실행하려고하면이에만 발생하는 것이 이상하다 이렇게하면 IntelliJ에서 실행할 때 아무런 오류가 없습니다.

mvn clean package 
java -jar target/NameOfJar.jar 

내가 여기에서 명백한 것을 놓쳤습니까? 이 온라인 같은 비슷한 문제를 가진 다른 사람들을 보았지만 해결책을 찾지 못했습니다.

감사 당신이 jersey-media-json-jackson 단지 내부를 보면 당신은이 파일의

META-INF/services/org.glassfish.jersey.internal.spi.AutoDiscoverable 

내용의 이름을 구현하는 클래스의 하나의 완전한 이름이어야합니다 파일을 볼 수

답변

9

입니다 즉 파일

org.glassfish.jersey.jackson.internal.JacksonAutoDiscoverable 

이 파일은 Jersey auto-discoverable mechanism에서 자동으로 기능 w를 등록하는 데 사용됩니다 명시 적으로 등록하지 않아도됩니다. 간단히 말해, 자동으로 등록해야하는 구성 요소가있는 모든 Jersey 모듈/항아리에는 위의 파일이 항아리에 있어야하며 내용은 자동 발견 가능 구성 요소의 이름입니다. 그런 다음 Jersey는 Service Loader pattern을 사용하여 파일에 명명 된 클래스를로드하고 등록합니다.

uber jar를 만들 때 발생하는 문제는 하나의 파일 복사본 만 가질 수 있으며 중복 파일을 가질 수 없다는 것입니다. 그렇다면 위의 파일을 가진 항아리가 여러 개 있으면 어떨까요? 그런 파일 중 하나만 uber jar에 포함됩니다. 어느 것? 누가 알겠습니까? 단 하나의 행운의 당첨자가 있습니다. 나머지 항아리의 경우 자동 감지 메커니즘이 실행되지 않습니다. 이는 자동 감지가 JacksonFeature을 등록하는 Jackson 기능의 경우입니다. 명시 적으로 응용 프로그램에 등록하려고 할 수 있으며 이제는 응용 프로그램에서 작동하는지 확인할 수 있습니다.

하지만이 파일이있는 다른 jar/모듈은 어떻게해야합니까? 이러한 이유로 uber jar를 만들 때 maven-shade-plugin을 사용해야합니다. 이 플러그인이 허용하는 것은 이 모두의 파일 내용을 결합하여 발견 물이 그 하나의 단일 파일에 포함되도록합니다.아래는 예제 사용법입니다.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.3</version> 
    <configuration> 
     <createDependencyReducedPom>true</createDependencyReducedPom> 
     <filters> 
      <filter> 
       <artifact>*:*</artifact> 
       <excludes> 
        <exclude>META-INF/*.SF</exclude> 
        <exclude>META-INF/*.DSA</exclude> 
        <exclude>META-INF/*.RSA</exclude> 
       </excludes> 
      </filter> 
     </filters> 
    </configuration> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <transformers> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
         <mainClass>com.example.YourApp</mainClass> 
        </transformer> 
       </transformers> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

이 예제는 실제로 Dropwizard's Getting Started에서 가져 왔습니다. 자세한 내용을 확인하실 수 있습니다. 주요 관심사는 ServicesResorceTransformer이며 서비스 파일을 연결합니다.

+0

저지 + 그리즐리 + Moxy 그리고 이것은 완벽하게 작동합니다! – Alexandre

관련 문제