当前位置: 首页 > 知识库问答 >
问题:

使用maven和shade插件创建可运行的war(tomcat)

拓拔骁
2023-03-14

共有1个答案

松元明
2023-03-14

好的,我找到了一个解决方案,并将在这里为其他有相同问题的人描述它。希望这能帮上什么忙。

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-webapp</artifactId>
    <version>8.1.17.v20150415</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-plus</artifactId>
    <version>8.1.16.v20140903</version>
</dependency>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <id>classes-copy</id>
                    <phase>prepare-package</phase>
                    <configuration>
                        <tasks>
                            <move
                                todir="${project.build.directory}/${project.artifactId}-${project.version}/">
                                <fileset dir="${project.build.directory}/classes/">
                                    <include name="**/warLauncher/**" />
                                    <include name="log4j.xml" />
                                </fileset>
                            </move>
                        </tasks>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <id>jetty-classpath</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>unpack-dependencies</goal>
                    </goals>
                    <configuration>
                        <includeGroupIds>org.eclipse.jetty,javax.servlet,org.slf4j,log4j,org.log4j</includeGroupIds>
                        <outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}</outputDirectory>
                        <excludes>**\/ECLIPSEF.*</excludes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <warName>${project.artifactId}-${project.version}</warName>
                <warSourceDirectory>src\main\webapp\WEB-INF</warSourceDirectory>
                <webXml>src\main\webapp\WEB-INF\web.xml</webXml>
                <archive>
                    <manifest>
                        <mainClass>your.package.warLauncher.WarLauncher</mainClass>
                        <addClasspath>true</addClasspath>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>default-war</id>
                    <phase>package</phase>
                    <goals>
                        <goal>war</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

战车

package your.package.warLauncher;

import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.bio.SocketConnector;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.HandlerCollection;

public class WarLauncher{

  public static void main(String[] args) throws Exception {
      JettyServerContext context = new JettyServerContext();
      Server server = new Server();

      // Create connector
      SocketConnector connector = new SocketConnector();
      connector.setMaxIdleTime(1000 * 60 * 60);
      connector.setSoLingerTime(-1);
      connector.setPort(8080);

      // Create handler collection
      ContextHandlerCollection contextHandlerCollection = new   ContextHandlerCollection();
      HandlerCollection handlerCollection = new HandlerCollection();
      handlerCollection.setHandlers(new Handler[] { contextHandlerCollection });

      // Add webapp context
      context.setServer(server);
      contextHandlerCollection.addHandler(context);

      server.setConnectors(new Connector[] { connector });
      server.setHandler(handlerCollection);
      server.start();
  }
}

JettyServerContext

package your.package.warLauncher;

import java.net.URL;
import java.security.ProtectionDomain;

import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JettyServerContext extends WebAppContext {

  private static Logger logger = LoggerFactory.getLogger(JettyServerContext.class);

  protected static final String[] JETTY_PLUS_CONFIGURATION_CLASSES;

  static {
    JETTY_PLUS_CONFIGURATION_CLASSES = new String[7];
    JETTY_PLUS_CONFIGURATION_CLASSES[0] = "org.eclipse.jetty.webapp.WebInfConfiguration";
    JETTY_PLUS_CONFIGURATION_CLASSES[1] = "org.eclipse.jetty.webapp.WebXmlConfiguration";
    JETTY_PLUS_CONFIGURATION_CLASSES[2] = "org.eclipse.jetty.webapp.MetaInfConfiguration";
    JETTY_PLUS_CONFIGURATION_CLASSES[3] = "org.eclipse.jetty.webapp.FragmentConfiguration";
    JETTY_PLUS_CONFIGURATION_CLASSES[4] = "org.eclipse.jetty.plus.webapp.EnvConfiguration";
    JETTY_PLUS_CONFIGURATION_CLASSES[5] = "org.eclipse.jetty.plus.webapp.PlusConfiguration";
    JETTY_PLUS_CONFIGURATION_CLASSES[6] = "org.eclipse.jetty.webapp.JettyWebXmlConfiguration";
  }

  public JettyServerContext() {
    setConfigurationClasses(JETTY_PLUS_CONFIGURATION_CLASSES);
    setContextPath("/");
    setWar(getWarLocation());
  }

  /**
   * Returns the location of the war (a trick, which is necessary for executable
   * wars please see: <a target="_blank" href=
   * "http://uguptablog.blogspot.de/2012/09/embedded-jetty-executable-war-with.html"
   * >Embedded Jetty with executable WAR</a>).
   * 
   * @return The war location.
   */
  protected String getWarLocation() {
    ProtectionDomain protectionDomain = JettyServerContext.class.getProtectionDomain();
    URL location = protectionDomain.getCodeSource().getLocation();
    return location.toExternalForm();
  }
}
 类似资料:
  • 我在一个使用openrdf的项目中,我需要shade插件来转换我的服务条目。我想同时建立一个战争和一个罐子,因为这两种用法都是可能的。但是,我不能让shade插件同时生成带阴影的jar和带阴影的WAR-Shade只在属性中定义的包类型上调用,并且将jar插件绑定到包阶段以便在war旁边创建一个jar,结果会产生一个无阴影的jar。我怎样才能同时创建一个有阴影的罐子和一个有阴影的战争呢?

  • 我正在尝试使用shade插件创建一个可执行JAR的简单示例。我逐行浏览了这里的示例,在我的机器上似乎根本没有执行shade插件。 我的阴影POM代码是: 运行“mvn包”后,创建的JAR不包含任何项目依赖项。从调试跟踪来看,似乎从未调用过shade插件。要让shade发挥其魔力,是否还需要一些额外的步骤? 编辑:示例的完整代码位于https://github.com/hutch31/maven-s

  • 问题内容: 使用Maven 3.1 Eclipse Helios Aspekt: 尝试使用maven-jar / dependency-plugins创建可运行的jar文件。 问题: 创建jar文件和依赖项后,当我尝试使用命令启动jar文件时出现NoCLassDefFoundErrors 但是类/文件可以在./dependency-jars文件夹中找到???我还尝试了以下命令: 这也不起作用。 题

  • 我正在使用maven shade插件创建一个胖罐子,其中也包括一些弹性城堡罐子。但这造成了问题,因为Bouncy Castle的未签名版本。

  • 我正试着做一个包含所有项目的胖uber罐子。如果我做了“MVN包”,我得到一个uber jar下的“blah”项目标签文件夹。(blah项目有主类。)uber jar包含所有项目(作为文件夹而不是jar),但当我运行它时,它似乎无法识别feature1和feature2项目。 我在上面添加了feature1和feature2的依赖项,以便它们在uber jar文件中。这错了吗?附注。blahmes

  • 我一直在使用<code>mvn tomcat7 maven-plugin:run-am-pl:foo</code>成功地在Tomcat中一次只运行一个项目,如下图所示。现在我想让多个模块在同一端口但不同的上下文下运行。例如,我希望: 这是我一直在使用的pom.xml片段的一个例子: 使用插件是否可以做到这一点?我正在努力寻找正确的语法来让它发挥良好的作用。当我运行命令来运行它时,它只运行它在项目层