代码之家  ›  专栏  ›  技术社区  ›  Justin Searls

Maven Tomcat插件使用配置的web.xml错误,清除后未找到fileNotFound

  •  0
  • Justin Searls  · 技术社区  · 15 年前

    尝试执行时 mvn tomcat:run 清洁后立即进行,并配置 tomcatWebXml 在pom中指定,我得到一个fileNotFoundException。

    以下是我的pom中的一个片段:

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>tomcat-maven-plugin</artifactId>
        <version>1.0-beta-1</version>
        <configuration>                 
            <path>/licensing</path>
            <tomcatWebXml>${basedir}/src/main/mock/web.xml</tomcatWebXml>
        </configuration>
    </plugin>
    

    这是我所经历的错误,但仅限于 清除后的第一个调用 ,随后的调用将找到该文件并正常工作。

    [INFO] ------------------------------------------------------------------------
    [ERROR] BUILD ERROR
    [INFO] ------------------------------------------------------------------------
    [INFO] Could not create Tomcat configuration
    
    Embedded error: C:\..snip..\src\main\mock\web.xml
    [INFO] ------------------------------------------------------------------------
    [INFO] Trace
    org.apache.maven.lifecycle.LifecycleExecutionException: Could not create Tomcat
    configuration
            at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(Defa
    ultLifecycleExecutor.java:703)
            at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandalone
    Goal(DefaultLifecycleExecutor.java:553)
            at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(Defau
    ltLifecycleExecutor.java:523)
            at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHan
    dleFailures(DefaultLifecycleExecutor.java:371)
            at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegmen
    ts(DefaultLifecycleExecutor.java:332)
            at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLi
    fecycleExecutor.java:181)
            at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:356)
            at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:137)
            at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
            at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:4
    1)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
    java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
    sorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
            at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
            at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
    
            at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
    Caused by: org.apache.maven.plugin.MojoExecutionException: Could not create Tomc
    at configuration
            at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java
    :153)
            at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPlugi
    nManager.java:483)
            at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(Defa
    ultLifecycleExecutor.java:678)
            ... 17 more
    **Caused by: java.io.FileNotFoundException: C:\...snip..\src\main\mock\web.xml**
            at org.codehaus.mojo.tomcat.AbstractRunMojo.copyFile(AbstractRunMojo.jav
    a:326)
            at org.codehaus.mojo.tomcat.AbstractRunMojo.initConfiguration(AbstractRu
    nMojo.java:273)
            at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java
    :143)
            ... 19 more
    

    我有什么办法解决这个问题吗?如果这是一个无条件的bug,它似乎会影响到任何人和每个人。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Pascal Thivent    15 年前

    我可以复制这个错误。不确定原因,但采用以下方法 AbstractRunMojo.java :

    private void copyFile( String fromPath, File toFile )
        throws IOException
    {
    
        URL fromURL = getClass().getResource( fromPath );
    
        if ( fromURL == null )
        {
            throw new FileNotFoundException( fromPath );
        }
    
        FileUtils.copyURLToFile( fromURL, toFile );
    }
    

    呼唤 getClass().getResource( fromPath ) 确实返回 null 在清除后立即使用URL,并在随后的调用中使用。我没有真正深入研究这个问题,但这似乎是一个类加载问题(可能与 MTOMCAT-25 )

    这很烦人,但解决方法显然是在第一次失败后第二次进球。

    编辑: 我已经报告了这个问题,看 MTOMCAT-42 已修复,并已发布Maven Tomcat插件的新快照!要使用它,请将以下代码段添加到 pom.xml :

      <pluginRepositories>
        <pluginRepository>
          <id>Codehaus Snapshots</id>
          <url>http://snapshots.repository.codehaus.org/</url>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
          <releases>
            <enabled>true</enabled>  <!-- Workaround for MNG-2974, see note below -->
          </releases>
        </pluginRepository>
      </pluginRepositories>
    

    然后将插件的版本更改为 1.0-SNAPSHOT 再试一次。