users@jersey.java.net

Re: [Jersey] Problem when packaging a Jersey App with Maven

From: Dominique Guinard <dguinard_at_ethz.ch>
Date: Thu, 22 Jul 2010 16:58:10 +0200

Dear Chris,

Thanks a lot for your reply!

>How are you packaging your jar? If you're using the assembly plugin
Yes that's what I'm using, here is the POM extract:

            <!-- Assemble with dependencies -->
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <id>create-executable-jar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptorRefs>

<descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>

<mainClass>com.webofthings.webplogg.web.App</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>


> the issue could be that the META-INF/services folder from the jersey
> dependencies isn't getting included properly in the resulting
> artifact. If that's the case you may be able to use the shade plugin
> to sort it out. There are some suggestions in this bug that could
> help:
> https://jersey.dev.java.net/issues/show_bug.cgi?id=440
>
I actually tried that but still get the same result, i.e. it did not
work. I'm quite new to Maven so not so sure I did everything correctly.

When I try using the shade plugin with:
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>

<mainClass>com.webofthings.webplogg.web.App</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
               <!-- Use this to in/exclude only specific dependencies
-->
                                <includes>

<include>commons-codec:commons-codec</include>
                                </includes>
                            </artifactSet>
                            <transformers>
                                <transformer
implementation="org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer" />
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

I actually get a jar without any dependencies at all. Am I doing
something wrong here?

When I use the assembly plugin is the META-INF/services folder seems to
be ok... I attached it to this mail.

Thanks a lot,

Dominique


On Tue, 2010-07-20 at 11:18 -0700, Chris Carrier wrote:
> How are you packaging your jar? If you're using the assembly plugin
> the issue could be that the META-INF/services folder from the jersey
> dependencies isn't getting included properly in the resulting
> artifact. If that's the case you may be able to use the shade plugin
> to sort it out. There are some suggestions in this bug that could
> help:
>
> https://jersey.dev.java.net/issues/show_bug.cgi?id=440
>
> Chris
>
> On Tue, Jul 20, 2010 at 11:09 AM, Dominique Guinard <dguinard_at_ethz.ch> wrote:
> > Dear Jersey folks,
> >
> > After a couple of years of Restlet app dev I decided to give a try to
> > Jersey. I actually really enjoyed using it but I'm stuck with a problem
> > right now.
> >
> > I embed my Jersey app in Grizzly and develop the whole thing as a maven
> > project in netbeans 6.9. So far so good, however when I try packaging
> > the app as a standalone project I keep getting the following message,
> > whatever resource I ask for, in whatever representation:
> >
> > ul 20, 2010 3:28:46 PM com.sun.jersey.spi.container.ContainerResponse
> > write
> > SEVERE: A message body writer for Java class java.lang.String, and Java
> > type class java.lang.String, and MIME media type text/plain was not
> > found
> > Jul 20, 2010 3:28:46 PM com.sun.grizzly.http.servlet.ServletAdapter
> > doService
> > SEVERE: service exception:
> > javax.ws.rs.WebApplicationException
> > at
> > com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:267)
> > at
> > com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1043)
> > at
> > com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:947)
> > at
> > com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:938)
> > at
> > com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:399)
> > at
> > com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:478)
> > at
> > com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:663)
> > at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
> > at
> > com.sun.grizzly.http.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:195)
> > at
> > com.sun.grizzly.http.servlet.FilterChainImpl.invokeFilterChain(FilterChainImpl.java:139)
> > at
> > com.sun.grizzly.http.servlet.ServletAdapter.doService(ServletAdapter.java:376)
> > at
> > com.sun.grizzly.http.servlet.ServletAdapter.service(ServletAdapter.java:324)
> > at
> > com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:166)
> > at
> > com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
> > at
> > com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
> > at
> > com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
> > at
> > com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
> > at
> > com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
> > at
> > com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
> > at
> > com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
> > at
> > com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
> > at
> > com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
> > at
> > com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
> > at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
> > at com.sun.grizzly.util.AbstractThreadPool
> > $Worker.doWork(AbstractThreadPool.java:330)
> > at com.sun.grizzly.util.AbstractThreadPool
> > $Worker.run(AbstractThreadPool.java:309)
> > at java.lang.Thread.run(Thread.java:619)
> >
> >
> >
> > Here is the resource in question (see below), any help is very welcomed,
> > I'm clueless right now!
> >
> >
> > package com.webofthings.webplogg.web.resources;
> >
> > import com.webofthings.webplogg.meter.SmartMeter;
> > import com.webofthings.webplogg.meter.ConsumptionData;
> > import com.webofthings.webplogg.meter.SmartMeterManager;
> > import com.webofthings.webplogg.meter.Status;
> > import com.webofthings.webplogg.meter.config.Configurator;
> > import com.webofthings.webplogg.meter.plogg.PloggManager;
> > import java.net.URI;
> > import java.util.ArrayList;
> > import java.util.List;
> > import javax.ws.rs.Consumes;
> > import javax.ws.rs.GET;
> > import javax.ws.rs.PUT;
> > import javax.ws.rs.Path;
> > import javax.ws.rs.PathParam;
> > import javax.ws.rs.Produces;
> > import javax.ws.rs.core.MediaType;
> > import javax.ws.rs.core.UriBuilder;
> >
> >
> > @Path("/smartmeters")
> > @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON,
> > MediaType.APPLICATION_ATOM_XML})
> > public class SmartMeterResource {
> >
> > private static SmartMeterManager ploggMgr =
> > PloggManager.getInstance();
> >
> > public SmartMeterResource() {
> > }
> >
> >
> > @GET
> > public List<SmartMeter> getSmartMeters() {
> > return new ArrayList(ploggMgr.getManagedSmartMeters().values());
> > }
> >
> > /**
> > * This produces an HTML representation of all the SmartMeters. I.e.
> > * a list with links to the each SmartMeter.
> > * @return The HTML representation of the list of SmartMeters.
> > */
> > @GET
> > @Produces("text/html")
> > public String getSmartMetersHTML() {
> > StringBuilder htmlOut = new StringBuilder("<html><body>");
> > for (SmartMeter currentSmartMeter :
> > ploggMgr.getManagedSmartMeters().values()) {
> >
> > /* Build URLs to child-resources (SmartMeter) */
> > UriBuilder builder =
> > UriBuilder.fromPath("/smartmeters/{id}");
> > int port = Integer.parseInt(Configurator.getInstance().
> > getProperty("WEB_SERVER_PORT"));
> > String host =
> > Configurator.getInstance().getProperty("WEB_SERVER_HOST");
> > builder.scheme("http").port(port).host(host);
> > UriBuilder clone = builder.clone();
> > URI uri = clone.build(currentSmartMeter.getId());
> >
> > htmlOut.append("<p>Name: " + currentSmartMeter.getName() +
> > "</br>");
> > htmlOut.append("ID: " + "<a href=\"");
> > htmlOut.append(uri.toString());
> > htmlOut.append("\">" + currentSmartMeter.getId() + "</a>");
> > htmlOut.append("</p>");
> > }
> >
> > htmlOut.append("</body></hmtl>");
> > return htmlOut.toString();
> > }
> >
> > @Path("/{smartMeterId}")
> > @GET
> > public ConsumptionData getMeterData(@PathParam("smartMeterId")
> > String smartMeterId) {
> > return ploggMgr.getDataFromMeter(smartMeterId);
> > }
> >
> > /**
> > * This produces an HTML representation of a given SmartMeter.
> > * @return The HTML representation of the list of SmartMeters.
> > */
> > @Path("/{smartMeterId}")
> > @GET
> > @Produces("text/html")
> > public String getMeterDataHTML(@PathParam("smartMeterId") String
> > smartMeterId) {
> > StringBuilder htmlOut = new StringBuilder("<html><body>");
> > ConsumptionData cons = ploggMgr.getDataFromMeter(smartMeterId);
> >
> > /* Build URLs to child-resources (SmartMeter) */
> > UriBuilder builder = UriBuilder.fromPath("/smartmeters/");
> > int port = Integer.parseInt(Configurator.getInstance().
> > getProperty("WEB_SERVER_PORT"));
> > String host =
> > Configurator.getInstance().getProperty("WEB_SERVER_HOST");
> > builder.scheme("http").port(port).host(host);
> > UriBuilder clone = builder.clone();
> > URI uri = clone.build();
> >
> > htmlOut.append("<p>Watts: " + cons.getWatt() + "</p>");
> > htmlOut.append("<p><a href=\"");
> > htmlOut.append(uri.toString());
> > htmlOut.append("\"></a>");
> >
> >
> > htmlOut.append("</body></hmtl>");
> > return htmlOut.toString();
> > }
> >
> >
> > @Path("/{smartMeterId}/status")
> > @GET
> > public Status getMeterStatus(@PathParam("smartMeterId") String
> > smartMeterId) {
> > return ploggMgr.getSmartMeter(smartMeterId).getStatus();
> > }
> >
> > @Path("/{smartMeterId}/status")
> > @PUT
> > @Consumes("text/plain")
> > public void setMeterStatus(@PathParam("smartMeterId") String
> > smartMeterId, String message) {
> > if (message.toLowerCase().equals("off")) {
> > ploggMgr.turnOffPower(smartMeterId);
> > } else {
> > ploggMgr.turnOnPower(smartMeterId);
> > }
> >
> > }
> > }
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> > For additional commands, e-mail: users-help_at_jersey.dev.java.net
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>