DRY定义jetty依赖关系的方式:运行和部署

时间:2010-10-06 13:58:33

标签: maven-2 jetty

我正在完成一个支持两种运行方式的Web项目的构建:

  • 在本地使用mvn jetty-run;
  • 部署在应用程序服务器上。

对于应用程序服务器,许多库都标记为provided,否则会发生类路径冲突。与此同时,我已将这些依赖项重新声明为jetty-maven-plugin的编译依赖项,否则目标无法正常运行。

构建工作正常,但我有大量重复的库。有没有更简洁的方法呢?

4 个答案:

答案 0 :(得分:3)

只是为了跟进此JETTY-429已合并,因此您可以谨慎添加configuration parameter <useProvidedScope>true</useProvidedScope>。这将包括 jetty插件类路径所提供的依赖项。

有关使用此选项可能带来的潜在问题的详细信息,请务必阅读JETTY-429

答案 1 :(得分:2)

总是有wicket解决方案。 (它不需要对wicket做任何事情,但可以在wicket maven archetype中找到。)

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

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作为额外的provided依赖:

<!-- 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>

答案 2 :(得分:2)

我不是说这是最好的解决方案,但是如何做到这一点:

  1. 您的默认依赖项将提供的依赖项列为“已提供”。默认项目配置应该生成将在非Jetty服务器上运行的WAR文件。
  2. 定义配置文件“jetty”并重新声明编译范围中提供的依赖项。然后运行mvn -Pjetty jetty:run
  3. 它可能不是世界上最干净的解决方案,因为它会强制重复,但它应该为你完成工作。

答案 3 :(得分:2)

我还想在运行Jetty时能够包含provided范围内的依赖项。实际上,Jetty已经有useTestClasspathtest范围内的依赖项做了类似的事情(为什么在这种情况下不包括provided依赖项),以避免在配置文件中重复依赖项。这由JETTY-429跟踪,其中包含此类标记的补丁。