IntelliJ IDEA 与 Eclipse 的 Maven 嵌套多模块项目中的 Jetty 资源库不同

Jetty resource base different in Maven Nested Multi-module project of IntelliJ IDEA vs Eclipse

我们有一个嵌套的多模块项目。我们的开发人员混合了 IntelliJ IDEA 和 Eclipse 用户。

当 运行 内部模块中的码头服务器时,似乎我们需要根据使用的 IDE 将资源库设置为不同的值。

对于 IntelliJ:

root.setResourceBase("myModule/src/main/webapp");

对于 Eclipse:

root.setResourceBase("src/main/webapp");

我们不想调整我们的 IDE 来让它工作,例如我不想更改 IntelliJ 中的某些设置以使其适用于 Eclipse 版本的代码。

有什么想法吗?

简答

Eclipse 与 Intellij 之间的执行差异可以通过不同的 PWD、${user.dir} 或工作目录设置来解释。

更好的答案

那么不要使用文件系统路径。

通过 Classloader.getResource() 在该位置查找已知资源,然后将父目录传递到 root.setResourceBase()

示例:

    Server server = new Server(8080);

    // Figure out what path to serve content from
    ClassLoader cl = WebAppContextFromClasspath.class.getClassLoader();
    // We look for a file, as ClassLoader.getResource() is not
    // designed to look for directories (we resolve the directory later)
    URL f = cl.getResource("hello.html");
    if (f == null)
    {
        throw new RuntimeException("Unable to find resource directory");
    }

    // Resolve file to directory
    URI webRootUri = f.toURI().resolve("./").normalize();
    System.err.println("WebRoot is " + webRootUri);

    WebAppContext webapp = new WebAppContext();
    webapp.setContextPath("/");
    webapp.setWar(webRootUri.toASCIIString());
    webapp.setParentLoaderPriority(true);

    server.setHandler(webapp);

    server.start();
    server.join();

您可以在 embedded-jetty-cookbook 示例中看到这一点:

其他更好的回答:

另一种方法是根据 运行

的情况找到 src/main/webapp 几种不同的方法

请参阅 ServerMain.java in the embedded-jetty-live-war 示例中的操作模式。