2012-03-20 21 views
8

Tôi đang cố gắng gói Grizzly với Jersey như một lọ duy nhất sử dụng plugin bóng Maven. Nhưng tôi luôn luôn nhận được thông báo No container provider supports the type class org.glassfish.grizzly.http.server.HttpHandlerjar độc lập Grizzly và Jersey

Mã này hoạt động tốt trong Eclipse, nhưng không phải trong một cái lọ đóng gói:

public class Main { 

private static URI getBaseURI() { 
    return UriBuilder.fromUri("http://localhost/").port(9998).build(); 
} 

public static final URI BASE_URI = getBaseURI(); 

protected static HttpServer startServer() throws IOException { 
    System.out.println("Starting grizzly..."); 
    ResourceConfig rc = new PackagesResourceConfig("share.test"); 
    rc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); 
    return GrizzlyServerFactory.createHttpServer(BASE_URI, rc); 
} 

public static void main(String[] args) throws IOException { 
    HttpServer httpServer = startServer(); 
    System.in.read(); 
    httpServer.stop(); 
}  
} 

Dưới đây là ngoại lệ hoàn

$ java -jar target/webServiceTest-0.0.1-SNAPSHOT.jar 
Starting grizzly... 
Mar 20, 2012 12:48:53 PM com.sun.jersey.api.core.PackagesResourceConfig init 
INFO: Scanning for root resource and provider classes in the packages: 
    share.test 
Mar 20, 2012 12:48:54 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses 
INFO: Root resource classes found: 
    class share.test.NonJAXBBeanResource 
    class share.test.Hello 
Mar 20, 2012 12:48:54 PM com.sun.jersey.api.core.ScanningResourceConfig init 
INFO: No provider classes found. 
Exception in thread "main" java.lang.IllegalArgumentException: No container provider supports the type class org.glassfish.grizzly.http.server.HttpHandler 
    at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:196) 
    at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:134) 
    at com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory.createHttpServer(GrizzlyServerFactory.java:242) 
    at share.test.Main.startServer(Main.java:27) 
    at share.test.Main.main(Main.java:31) 

Tôi đang xây dựng các gói jar sử dụng maven với

<build> 
<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>1.5</version> 
    <configuration> 
    <transformers> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
    <manifestEntries> 
     <Main-Class>share.test.Main</Main-Class> 
     <Build-Number>1</Build-Number> 
    </manifestEntries> 
    </transformer> 
    </transformers> 
</configuration> 
<executions> 
<execution> 
    <phase>package</phase> 
    <goals> 
    <goal>shade</goal> 
    </goals> 
</execution> 
</executions> 
</plugin> 
</plugins> 
</build> 

Tôi có cần thay đổi phích cắm bóng râm không để bao gồm bất cứ điều gì khác?

Trả lời

8

Lỗi có vẻ như plugin không hợp nhất các bản ghi dịch vụ META-INF/dịch vụ từ các bình khác nhau - nếu có nhiều tệp có cùng tên trong thư mục META-INF/services của một số lọ, chúng cần được hợp nhất , không được thay thế bởi cái kia. Kiểm tra xem đó là trường hợp.

+3

Thêm ServicesResourceTransformer rằng "Kết hợp-META INF nguồn/dịch vụ" đã giải quyết vấn đề của tôi, cảm ơn bạn Martin. Chỉ cần thêm '' vào biến trong tham chiếu pom.xml: [link] (http://maven.apache.org /plugins/maven-shade-plugin/examples/resource-transformers.html#ServicesResourceTransformer) –

0

Tôi vừa phạm sai lầm ngu ngốc. Cấu hình maven-assembly-plugin trong pom là tốt.

hội dường như thay thế META-INF/dịch vụ và ghi đè "com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainerProvider " trong File com.sun.jersey.spi.container.ContainerProvider

Là hướng dẫn http://maven.apache.org/plugins/maven-assembly-plugin/ được đề cập, Nếu dự án của bạn muốn đóng gói đồ tạo tác của bạn trong một uber-jar, plugin lắp ráp chỉ cung cấp hỗ trợ cơ bản. Để kiểm soát nhiều hơn, hãy sử dụng Maven Shade Plugin.

<!-- mvn assembly:assembly --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <mainClass>XXX.DaemonMain</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
     </plugin> 
1

Các liên kết sau đây đã giúp tôi tìm ra giải pháp dưới đây:

đặc biệt là câu trả lời

Thay vì sử dụng các phụ thuộc jar-với-như descriptorRef cấu hình lắp ráp-plugin của bạn bạn tạo riêng của chúng tôi ví dụ trong src/assembly/depmerge.xml (xem bên dưới). Cấu hình assembly này sẽ thêm một containerDescriptorHandler mà quan tâm đến các dịch vụ META-INF /.

chạy

mvn clean compile assembly:single 

để có được một file jar trong mục tiêu mà bạn có thể gọi với

java -jar target/x.y.-version-jar-with-dependencies.jar 

pom.xml:

 <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.5.3</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>${mainClass}</mainClass> 
        </manifest> 
       </archive> 
      <descriptor>src/assembly/depmerge.xml</descriptor> 
      </configuration> 
     </plugin> 

src/lắp ráp/depmerge.xml:

<!-- 
see http://maven.apache.org/guides/mini/guide-assemblies.html 
see http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html 
--> 
<assembly 
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 
    <!-- TODO: a jarjar format would be better --> 
    <id>jar-with-dependencies-and-services</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
     <dependencySet> 
      <outputDirectory>/</outputDirectory> 
      <useProjectArtifact>true</useProjectArtifact> 
      <unpack>true</unpack> 
      <scope>runtime</scope> 
     </dependencySet> 
    </dependencySets> 
    <!-- 
     https://stackoverflow.com/questions/1607220/how-can-i-merge-resource-files-in-a-maven-assembly 
    --> 
    <containerDescriptorHandlers> 
     <containerDescriptorHandler> 
      <handlerName>metaInf-services</handlerName> 
     </containerDescriptorHandler> 
    </containerDescriptorHandlers> 
</assembly> 
Các vấn đề liên quan