【问题标题】:Error while executing WAR file执行 WAR 文件时出错
【发布时间】:2016-10-26 00:36:06
【问题描述】:

我已经使用 maven 插件为我的项目结构构建了一个 war 文件。现在当我运行这个war文件时,我得到了错误

Error: Could not find or load main class com.abc.HelloWorld.App 

由于某种原因,当我检查war文件时,我的主类正在WEB-INF/classes/com/abc/HelloWorld/下生成

我尝试将类路径添加到Manifest.MF 文件,但没有帮助。

这是我用于创建战争文件的 maven 插件。此项目还包含一个嵌入式码头服务器。

<plugin>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.1.1</version>
  <configuration>
  <webXml>WebContent\WEB-INF\web.xml</webXml>
    <warName>${project.artifactId}-${project.version}</warName>              
    <archive>
      <manifest>
        <addClasspath>true</addClasspath>
        <mainClass>com.infor.HelloWorld.App</mainClass>
      </manifest>
    </archive>
    <overlays>
    <overlay>
     <id>com.abc.HelloWorld</id>    
     <type>jar</type>
    </overlay>
    </overlays>
  </configuration>
  <executions>
    <execution>
      <id>default-war</id>
      <phase>package</phase>
      <goals>
        <goal>war</goal>
      </goals>
    </execution>
  </executions>
</plugin>

我试过this question,但没有帮助。

【问题讨论】:

    标签: java maven embedded-jetty


    【解决方案1】:

    WebApp WAR 文件是为 Web 容器打包的专用 jar 文件,以便从中进行部署。

    你可以有一个自动执行的war文件,但你最终会得到一个覆盖了JAR行为的WAR文件,这样META-INF/MANIFEST.MF和它的Main-Class就可以实例化Jetty,然后将webapp本身加载到那个服务器实例。

    看看下面这个由 Jetty Project 维护的项目。

    https://github.com/jetty-project/embedded-jetty-live-war

    在以下情况下要小心很重要:

    • 将服务器类合并到 WAR 文件中,以免 webapp 部署失败(对于服务器类路径和 webapp 类路径之间的重叠类)。
    • 合并META-INF/services/文件
    • 不要将太多的Server部分暴露给HTTP客户端(不要让他们下载任何敏感的东西!)——这可以通过将这个启动的服务器部分放在/WEB-INF/中来实现目录
    • 您不想让 webapp (war) 启动并了解服务器组件(这可能会导致双重初始化,一次在服务器类加载器中,一次在 webapp 类加载器中)

    如该项目所述:

    该项目应该为那些从自执行 WAR 文件的角度研究 Embedded Jetty 使用的人提供基线。

    该项目有 4 个主要部分:

    • /thewebapp/ - 这是 WAR 文件,webapp,因为它以其本机格式存在,具有普通的 maven &lt;packaging&gt;war&lt;/packaging&gt; 和一个生成的工件,它只是一个(尚未)自动执行的 WAR 文件。李>
    • /theserver/ - 这是嵌入式 Jetty 服务器jetty.livewar.ServerMain.main(String args[]),您可以自定义它来初始化您的 Jetty 服务器及其 WebApp。该项目也是您自定义 JDBC 服务器库、JNDI、日志记录等内容的地方。该项目生成一个 uber-jar,其中包含运行服务器所需的所有依赖项。要特别注意 maven-shade-plugin 以合并 META-INF/services/ 文件。
    • /server-bootstrap/ - 这包含 2 个小类,它们从实时 WAR 中的内容设置 LiveWarClassLoader,然后从这个新的 ClassLoader 运行 jetty.livewar.ServerMain.main(String args[])。该项目还包含实时 WAR 需要/使用的实时 META-INF/MANIFEST.MF
    • /livewar-assembly/ - 这是将上述 3 个项目绑定到一个 Live/Executable WAR 文件中的项目。来自上述 3 个项目的工件由 maven-assembly-plugin 解包,并放置在它们最实用(和安全)的地方。例如,/theserver/ 中的服务器类被放置在 /WEB-INF/jetty-server/ 中,以使访问 WAR 文件的 Web 客户端无法访问它们。

    注意:您应该注意新组装的 WAR 文件中存在 3 个文件,因为如果您使用此设置,Web 客户端可以将这些文件作为静态内容下载。

    • /jetty/bootstrap/JettyBootstrap.class
    • /jetty/bootstrap/LiveWarClassLoader.class
    • /META-INF/MANIFEST.MF

    示例项目的设置方式是,这些引导文件中的信息不应泄露有关您的服务器或其操作的私人或敏感信息。只是 Webapp 可以作为 Live/Executable WAR 文件启动。

    【讨论】:

      猜你喜欢
      • 2013-06-01
      • 2014-06-18
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      相关资源
      最近更新 更多