| Hi, 
 Thanks for the tip. But I don't want the jar-with-dependencies, it doesn't play well with spring for instance. (It overwrites META-INF and such). 
 I think I solved the issue by implementing my own resource class that is returned from the DefaultServlet.getResource(). It works in my case, but I can't really see if there are any side-effects I don't know about (yet). So if any of the commiters can check that would be great. 
 The resource: 
 public class JarInJarResource extends URLResource {
 private static final String JAR_FILE_PROTOCOL = "jar:file:/";
 private ByteArrayOutputStream resourceOutput = new ByteArrayOutputStream();
 private long lastModified;
 
 public JarInJarResource(Resource resource) {
 super(resource.getURL(), null);
 }
 
 @Override
 public boolean exists() {
 int firstIndexOfJarSeparator = this._urlString.indexOf("!/");
 int lastIndexOfJarSeparator = this._urlString.lastIndexOf("!/");
 try {
 JarFile mainJar = getMainJar(firstIndexOfJarSeparator);
 JarEntry jarInJar = getJarInJarAsJarEntry(firstIndexOfJarSeparator, lastIndexOfJarSeparator, mainJar);
 JarInputStream jarInJarStream = getJarInJarAsJarInputStream(mainJar, jarInJar);
 JarEntry jarEntry = null;
 while ((jarEntry = jarInJarStream.getNextJarEntry()) != null) {
 String fileNameRequested = this._urlString.substring(lastIndexOfJarSeparator + 2);
 if (jarEntry.getName().equals(fileNameRequested)) {
 IOUtils.copy(jarInJarStream, resourceOutput);
 lastModified = jarInJar.getTime();
 return true;
 }
 }
 } catch (IOException e) {
 Log.debug(Log.EXCEPTION, e);
 }
 return false;
 }
 
 private JarInputStream getJarInJarAsJarInputStream(JarFile jarFile, JarEntry entry) throws IOException {
 InputStream jarInJarInputStream = jarFile.getInputStream(entry);
 return new JarInputStream(jarInJarInputStream);
 }
 
 private JarFile getMainJar(int firstIndexOfJarSeparator) throws IOException {
 String firstJar = this._urlString.substring(0, firstIndexOfJarSeparator).replaceAll(JAR_FILE_PROTOCOL, "");
 return new JarFile(firstJar);
 }
 
 private JarEntry getJarInJarAsJarEntry(int firstIndexOfJarSeparator, int lastIndexOfJarSeparator, JarFile jarFile) {
 String secondJar = this._urlString.substring(firstIndexOfJarSeparator + 2, lastIndexOfJarSeparator);
 return jarFile.getJarEntry(secondJar);
 }
 
 @Override
 public synchronized InputStream getInputStream() throws IOException {
 return new ByteArrayInputStream(resourceOutput.toByteArray());
 }
 
 @Override
 public long lastModified() {
 return lastModified;
 }
 }
 
 The Extension on DefaultServlet: 
 public class OneJarSupportingDefaultServlet extends DefaultServlet {private static final long serialVersionUID = 1L;
 
 @Override
 public Resource getResource(String pathInContext) {
 Resource resource = super.getResource(pathInContext);
 if(resource instanceof JarResource) {
 return new JarInJarResource(resource);
 }
 return resource;
 }
 }
 
 
 -- Lars  On Apr 23, 2011, at 12:46 PM, Ondrej Zizka wrote: 
_______________________________________________
Instead of one-jar, try the assembly plugin with it's `jar-with-dependencies` built-in descriptorRef:http://ondra.zizka.cz/stranky/programovani/java/maven/maven-create-distribution-package.texy 
Ondra
 
On Fri, 2011-04-22 at 09:29 +0200, Lars Vonk wrote:
 
    Hi,
 
    
 
 
    I am trying to create an application using embedded Jetty (version 7.4.0.v20110414) and want to package it using the onejar maven plugin (http://code.google.com/p/onejar-maven-plugin/).
 
    
 
 
    Here is the code where I start jetty:
 
    
 
 
        Server server = new Server(8180);
 
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);context.setContextPath("/");
 context.setWelcomeFiles(new String[]{"index.html"});
 
 
 
 
        ServletHolder servletHolder = new ServletHolder(new DefaultServlet());URL resource = getClass().getResource("/web/");
 String resourceBase = resource.toURI().toString();
 servletHolder.setInitParameter("resourceBase", resourceBase);
 context.addServlet(servletHolder, "/");
 
    
 
 
        server.setHandler(context);
 
        server.start();
 
    
 
 
    
 
 
    When I do java -jar onejar.jar and go to http://localhost:8180/index.html I get a 404.
 
    
 
 
    
 
 
    My onejar.jar looks like this:
 
    
 
 
    onejar.jar
 
    main/myapp.jar
 
    main/myapp.jar/web/index.html
 
    
 
 
    
 
 
    (Rest omitted for readability).
 
    
 
 
    
 
 
    I debugged through the application and noticed it throws (and ignores) an exception in the org.eclipse.jetty.util.resource.JarFileResource class in the method exists() in this piece of code:
 
    
 
 
    try{
 JarURLConnection c=(JarURLConnection)((new URL(_jarUrl)).openConnection());
 c.setUseCaches(getUseCaches());
 jarFile=c.getJarFile();
 }
 catch(Exception e)
 {
 Log.ignore(e);
 }
 
    
 
 
    The _jarUrl contains: jar:file:/target/onejar.jar!/main/myapp.jar!/web/index.html and throws a ZipException when doing c.getJarFile(): java.util.zip.ZipException: error in opening zip file.
 
    
 
 
    
 
 
    Does anyone has experience in using embedded jetty with the mentioned onejar plugin? What I'd like to do is do java -jar myjar.jar where myjar contains everything that is needed, no additional files and such.
 
    
 
 
    Extra information:
 
    
 
 
    I also created a unit test for this asfollows:
 
    
 
 
    @Testpublic void defaultServlet() throws Exception {
 final Server server = new Server(8181);
 ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
 
        context.setContextPath("/");context.setWelcomeFiles(new String[]{"index.html"});
 DefaultServlet defaultServlet = new DefaultServlet();
 ServletHolder servlet = new ServletHolder(defaultServlet);
 servlet.setInitParameter("resourceBase", "jar:file:/target/onejar.jar!/main/myapp.jar!/web/");
 context.addServlet(servlet, "/");
 server.setHandler(context);
 server.start();
 Resource resource = defaultServlet.getResource("/index.html");
 assertNotNull(resource);
 
        server.stop();}
 
    
 
 
    This tests succeeds, meaning resource is not null. Does a real request use something else to find the resources that the getResource method on the servlet?
 
    
 
 
    Thanks in advance,
 
    
 
 
    Lars 
 
    
 
 
_______________________________________________
jetty-users mailing list
jetty-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/jetty-users
jetty-users mailing list
 jetty-users@xxxxxxxxxxx
 https://dev.eclipse.org/mailman/listinfo/jetty-users
 
 |