2012-03-20 2 views
8

Я пытаюсь упаковать Grizzly с Джерси как единую банку, используя плагин Maven shade. Но я всегда получаю сообщение No container provider supports the type class org.glassfish.grizzly.http.server.HttpHandlerGrizzly и Jersey standalone jar

кода прекрасно работает в Eclipse, но не в упакованной банке:

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(); 
}  
} 

Вот полное исключение

$ 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) 

Я строй пакета банки с использованием maven с

<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> 

Нужно ли менять штепсельную вилку чтобы включить что-нибудь еще?

ответ

8

Ошибка выглядит так, что плагин не сливает записи META-INF/services из разных банок правильно - если в каталоге META-INF/services несколько банок есть несколько файлов с тем же именем, их необходимо объединить , которые не заменяются друг на друга. Проверьте, так ли это.

+3

Добавление ServicesResourceTransformer, что "сливает META-INF/услуги ресурсы" сделал решить мою проблему, спасибо Мартину. Просто нужно добавить '' к трансформатору в pom.xml Ссылка: [ссылка] (http://maven.apache.org /plugins/maven-shade-plugin/examples/resource-transformers.html#ServicesResourceTransformer) –

0

Я только что сделал глупую ошибку. Настройте maven-assembly-plugin в pom.

Ассамблея, кажется, заменить META-INF/услуги и переопределить "com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainerProvider " в файле com.sun.jersey.spi.container.ContainerProvider

Как указано в руководстве http://maven.apache.org/plugins/maven-assembly-plugin/. Если ваш проект хочет упаковать ваш артефакт в uber-jar, плагин сборки обеспечивает только базовую поддержку. Для большего контроля используйте плагин Maven Shade.

<!-- 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

Следующие ссылки помогли мне выяснить, решение ниже:

особенно ответ

Вместо использования зависимостей банка-с-как descriptorRef вашей конфигурации сборки плагина вы создаете наши собственные, например, в src/assembly/depmerge.xml (см. ниже). Эта конфигурация сборки добавит containerDescriptorHandler, который будет обслуживать META-INF/services.

пробег

mvn clean compile assembly:single 

получить файл банки в цели которой вы можете звонить с

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

П.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/сборки/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> 
Смежные вопросы