Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Fixed: Embedded Jetty Fails To Unpack With FileNotFoundException: Not a directory

DZone's Guide to

Fixed: Embedded Jetty Fails To Unpack With FileNotFoundException: Not a directory

· Java Zone ·
Free Resource

The CMS developers love. Open Source, API-first and Enterprise-grade. Try BloomReach CMS for free.

I have built an executable .war with an embedded Jetty and all the dependencies packed in using the Maven Shade and War plugins. When I tried to run it (java -jar <my war>.war) then I got a strange FileNotFoundException during the unpack phase. It was strange because the unpack code actually checks whether a file’s parent directory exists and creates it if it doesn’t.

The problem was that I use OS X which has a case-insensitive filesystem. A directory contained both the file LICENSE and the directory license/. When Jetty tried to unpack license/LICENSE.base64.txt, the check for the parent directory (license/) incorrectly succeeded (because it checked new File("[..]/license/LICENSE.base64.txt").getParentFile().exists() and that returned true because the file LICENSE already was there, and it wasn’t distinguished from the actual directory license; .isDirectory() would have at least failed.) The workaround was to exclude the offensive file from the archive:

<project ...>
    ...
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.6</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                            </transformers>
                            <finalName>fake-cc-proxy-with-dependencies</finalName>
                            <filters>
                                <filter>
                                    <artifact>*</artifact>
                                    <excludes>
                                        <exclude>META-INF/LICENSE</exclude> <!-- conflicts on OS X with license/) -->
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

This was the original exception:

2013-10-02 13:44:16.557:WARN:oejw.WebAppContext:main: Failed startup of context o.e.j.w.WebAppContext@76959acc{/,null,null}{file:/Users/me/FakePM/target/fake-pm-with-dependencies.war}
java.io.FileNotFoundException: /private/var/folders/k0/2842tm752zv1dh4q77_gmgdr0000gn/T/jetty-0.0.0.0-8444-fake-pm-with-dependencies.war-_-any-/webapp/META-INF/license/LICENSE.base64.txt (Not a directory)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:165)
    at org.eclipse.jetty.util.resource.JarResource.copyTo(JarResource.java:237)
    at org.eclipse.jetty.webapp.WebInfConfiguration.unpack(WebInfConfiguration.java:478)
    at org.eclipse.jetty.webapp.WebInfConfiguration.preConfigure(WebInfConfiguration.java:72)
    at org.eclipse.jetty.webapp.WebAppContext.preConfigure(WebAppContext.java:453)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:489)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:108)
    at org.eclipse.jetty.server.Server.start(Server.java:342)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:90)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:58)
    at org.eclipse.jetty.server.Server.doStart(Server.java:290)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69)
    at no.viatravel.poc.safecc.profilemaster.Main.startServerAndBlock(Main.java:123)
    at no.viatravel.poc.safecc.profilemaster.Main.main(Main.java:38)
2013-10-02 13:44:16.575:INFO:oejs.ServerConnector:main: Started ServerConnector@478bc78e{HTTP/1.1}{0.0.0.0:8444}

See JarResource.java:230 in jetty 9.0.5.x for the relevant code.

BloomReach CMS: the API-first CMS of the future. Open-source & enterprise-grade. - As a Java developer, you will feel at home using Maven builds and your favorite IDE (e.g. Eclipse or IntelliJ) and continuous integration server (e.g. Jenkins). Manage your Java objects using Spring Framework, write your templates in JSP or Freemarker. Try for free.

Topics:

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}