Maven 2 为jetty定义依赖关系的干法:运行和部署

Maven 2 为jetty定义依赖关系的干法:运行和部署,maven-2,jetty,Maven 2,Jetty,我将结束一个web项目的构建,该项目支持两种运行方式: 本地使用mvn码头运行 部署在应用服务器上 对于应用程序服务器,许多库被标记为提供的,否则会发生类路径冲突。同时,我将这些依赖项重新声明为jetty maven插件的编译依赖项,因为否则目标无法正常运行 构建是这样工作的,但是我有大量重复的库。有没有更干净的方法呢?好吧,总是有wicket解决方案的。(它与wicket没有任何关系,但可以在中找到。) 使用以编程方式启动jetty的主类,并将项目作为webapp上下文。这应该能够获取所有

我将结束一个web项目的构建,该项目支持两种运行方式:

  • 本地使用
    mvn码头运行
  • 部署在应用服务器上
对于应用程序服务器,许多库被标记为
提供的
,否则会发生类路径冲突。同时,我将这些依赖项重新声明为
jetty maven插件的编译依赖项
,因为否则目标无法正常运行


构建是这样工作的,但是我有大量重复的库。有没有更干净的方法呢?

好吧,总是有wicket解决方案的。(它与wicket没有任何关系,但可以在中找到。)

使用以编程方式启动jetty的主类,并将项目作为webapp上下文。这应该能够获取所有maven依赖项,即使在所有主要IDE上提供的范围内也是如此。下面是这样一节课:

public class Start{

    private static final Logger LOG = Logger.getLogger(Start.class);

    public static void main(final String[] args) throws Exception{
        LOG.addAppender(new ConsoleAppender(new SimpleLayout(), "system.out"));
        final Server server = new Server();
        final SocketConnector connector = new SocketConnector();

        // Set some timeout options to make debugging easier.
        connector.setMaxIdleTime(1000 * 60 * 60);
        connector.setSoLingerTime(-1);
        connector.setPort(9090);
        server.setConnectors(new Connector[] { connector });

        final WebAppContext bb = new WebAppContext();
        bb.setServer(server);
        bb.setContextPath("/");
        bb.setWar("src/main/webapp");
        server.addHandler(bb);

        try{
            LOG.info(//
            ">>> STARTING EMBEDDED JETTY SERVER, PRESS ANY KEY TO STOP" //
            );
            server.start();
            System.in.read();
            LOG.info(">>> STOPPING EMBEDDED JETTY SERVER");
            server.stop();
            server.join();

        } catch(final Exception e){
            LOG.error("Something bad happened", e);
            System.exit(100);
        }
    }

    // CHECKSTYLE:ON
}
好的方面:您可以将其作为标准eclipse运行配置启动,包括简单的调试。 缺点:您需要jetty作为附加的
依赖项:

<!-- JETTY DEPENDENCIES FOR TESTING -->
<dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty</artifactId>
    <version>${jetty.version}</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty-util</artifactId>
    <version>${jetty.version}</version>
    <scope>provided</scope>
</dependency>

org.mortbay.jetty
码头
${jetty.version}
假如
org.mortbay.jetty
码头
${jetty.version}
假如

我不是说这是最好的解决方案,但这样做怎么样:

  • 默认依赖项将提供的依赖项列为“已提供”。默认项目配置应生成WAR文件,这些文件将在非Jetty服务器上运行
  • 定义概要文件“jetty”,并在编译范围内重新声明提供的依赖项。然后运行mvn-Pjetty jetty:run

  • 它可能不是世界上最干净的解决方案,因为它会强制执行一些重复操作,但它应该可以为您完成任务。

    我还希望在运行Jetty时能够使用某种标志来包含
    提供的
    范围内的依赖项。实际上,Jetty已经有了一个类似的方法来测试范围内的依赖项(在这种情况下为什么不包括
    提供的
    依赖项),以避免在概要文件中重复依赖项。这是由具有此标志的修补程序的系统跟踪的。

    为了跟进此问题,已将其合并,以便您可以小心地添加一个
    true
    。这将包括提供的对jetty插件类路径的依赖项


    关于使用此选项可能带来的潜在问题的详细信息,值得一读。

    有趣的是,我会看一看。+1因为它有效,而不是因为干燥:)但不知怎的,我想知道为什么在使用该标志时不添加
    提供的
    依赖项。这听起来不会错的,伊姆霍。帕斯卡说的:-)。它包含与当前解决方案大致相同的副本,因此我不太愿意更改它。类路径引用是一个好主意(+1)