执行WAR文件时出错

时间:2016-10-26 00:36:06

标签: java maven embedded-jetty

我使用maven插件为我的项目结构构建war文件。现在,当我运行此war文件时,我收到错误

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

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

我尝试在Manifest.MF文件中添加了一个类路径,但它没有帮助。

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

<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,但没有帮助。

1 个答案:

答案 0 :(得分:2)

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

你可以拥有一个自动执行的war文件,但你最终会得到一个重叠了JAR行为的WAR文件,以便META-INF/MANIFEST.MF及其Main-Class可以实例化Jetty,然后将webapp本身加载到该Server实例中。

看一下Jetty项目维护的以下项目。

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

在以下情况下要小心谨慎:

  • 将Server类合并到WAR文件中,以避免webapp部署失败(对于服务器类路径和webapp类路径之间的重叠类)。
  • 合并META-INF/services/个文件
  • 没有将自我可执行文件的Server方面暴露给HTTP客户端(不要让他们下载任何敏感内容!) - 这可以通过将此启动的服务器部分放入/WEB-INF/目录
  • 你不想让webapp(war)启动步行并了解服务器组件(这可能导致双重初始化,一次在服务器类加载器中,再次在webapp类加载器中)

正如该项目所述:

此项目应为从自执行WAR文件角度调查使用嵌入式Jetty的人员提供基准。

该项目有4个主要部分:

  • /thewebapp/ - 这是WAR文件,即webapp,因为它以原生格式存在,具有普通的maven <packaging>war</packaging>和生成的工件,它只是一个不是WAR文件的文件(还)自我执行。
  • /theserver/ - 这是您自定义的嵌入式Jetty服务器jetty.livewar.ServerMain.main(String args[]),用于初始化您的Jetty服务器及其WebApp。此项目也是您自定义JDBC服务器库,JNDI,日志记录等内容的地方。此项目生成一个具有运行服务器所需的所有依赖项的超级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
  •   
     

示例项目的设置方式使得这些引导程序文件中的信息不会泄露有关您的服务器或其操作的私有或敏感信息。仅仅是Web应用程序可以作为Live / Executable WAR文件启动。