https://bz.apache.org/bugzilla/show_bug.cgi?id=59274

            Bug ID: 59274
           Summary: web-fragment.xml ordering broken with
                    unpackWARs="false" (MalformedURLException: no !/ in
                    spec)
           Product: Tomcat 8
           Version: 8.0.28
          Hardware: PC
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Catalina
          Assignee: dev@tomcat.apache.org
          Reporter: tho...@m3y3r.de

Hi,

when using web-fragment.xml to define a order between JARs inside a WAR file
and when running Tomcat with unpackWARs="false" the container fails with an
MalformedURLException. Stack trace is:
Daemon Thread [localhost-startStop-1] (Suspended (exception
MalformedURLException))    
    owns: ContextConfig  (id=65)    
    owns: StandardContext  (id=66)    
    URL.<init>(URL, String, URLStreamHandler) line: 622    
    URL.<init>(URL, String) line: 483    
    URL.<init>(String) line: 432    
    JarURLConnection(JarURLConnection).parseSpecs(URL) line: 175    
    JarURLConnection(JarURLConnection).<init>(URL) line: 158    
    JarURLConnection.<init>(URL, Handler) line: 81    
    Handler.openConnection(URL) line: 41    
    URL.openConnection() line: 972    
    URL.openStream() line: 1038    
    WebappServiceLoader<T>.parseConfigFile(LinkedHashSet<String>, URL) line:
161    
    WebappServiceLoader<T>.load(Class<T>) line: 118    
    ContextConfig.processServletContainerInitializers() line: 1616    
    ContextConfig.webConfig() line: 1128    
    ContextConfig.configureStart() line: 771    
    ContextConfig.lifecycleEvent(LifecycleEvent) line: 305    
    LifecycleSupport.fireLifecycleEvent(String, Object) line: 95    
    StandardContext(LifecycleBase).fireLifecycleEvent(String, Object) line: 90  
    StandardContext.startInternal() line: 5080    
    StandardContext(LifecycleBase).start() line: 150    
    StandardHost(ContainerBase).addChildInternal(Container) line: 725    
    StandardHost(ContainerBase).addChild(Container) line: 701    
    StandardHost.addChild(Container) line: 717    
    HostConfig.deployWAR(ContextName, File) line: 945    
    HostConfig$DeployWar.run() line: 1798    
    Executors$RunnableAdapter<T>.call() line: 511    
    FutureTask<V>.run() line: 266    
    ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1142    
    ThreadPoolExecutor$Worker.run() line: 617    
    Thread.run() line: 745    

The problem seems to be in class WebappServiceLoader which has this flawed
logic in the load() method:
                String base = jarUrl.toExternalForm();
                URL url;
                if (base.endsWith("/")) {
                    url = new URL(base + configFile);
                } else {
                    url = new URL("jar:" + base + "!/" + configFile);
                }

I think the problem is that when running in unpackWARs="false" the base URL can
be something like this:
jar:file:/path/to/tomcat/installation/webapps/webapp.war!/WEB-INF/lib/library-file.jar

it then adds another jar: infront of the URL resulting in a URL of:
jar:jar:file:/path/to/tomcat/installation/webapps/webapp.war!/WEB-INF/lib/library-file.jar

which cannot be parsed be the URL class:
java.net.MalformedURLException: no !/ in spec

I think this bug was introduced in commit
646bba33e0e269a2c1ffa03d92da3aea3a36d95a ( Fix for
https://issues.apache.org/bugzilla/show_bug.cgi?id=55287 )

When running with unpackWARs="true" the web-fragment.xml ordering is correctly
processed.

-- 
You are receiving this mail because:
You are the assignee for the bug.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to