【问题标题】:Maven Webjars are not found未找到 Maven Webjar
【发布时间】:2018-04-10 14:42:37
【问题描述】:

我正在尝试根据他们的documentation 使用 webjars 进行引导

<dependencies>
    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>bootstrap</artifactId>
        <version>3.1.0</version>
    </dependency>
</dependencies>

这就是我启动服务器的方式。

public static void main(String[] args) throws Exception {
        final Server server = createServer();
        try {
            server.start();
            server.join();
        } finally {
            server.destroy();
        }
    }
private static Server createServer() throws Exception {
        final int serverPort = getServerPort();

        final Server server = new Server(serverPort);
        final HandlerList  servletContextHandlers = new HandlerList();
        servletContextHandlers.addHandler(buildServletContextHandler());
        server.setHandler(servletContextHandlers);

        return server;
    }

    private static ServletContextHandler buildServletContextHandler() throws ConfigurationException {
        final ResourceConfig resourceConfig = new ResourceConfig();
        resourceConfig.register(new CustomApiBinder());
        resourceConfig.packages("com.foo.api");

        final ServletHolder servletHolder = new ServletHolder(new ServletContainer(resourceConfig));

        final ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
        servletContextHandler.setContextPath("/api");
        servletContextHandler.addServlet(servletHolder, "/*");

        return servletContextHandler;
    }

然后当我尝试链接引导 css 表时,我得到一个文件未找到错误

<link rel='stylesheet' href='webjars/bootstrap/3.1.0/css/bootstrap.min.css'>

我需要一个特殊的处理程序吗?从文档中可以看出,如果您使用 servlet 3,则不需要其他任何东西。

有人有没有使用 Spring 的例子吗?

码头 9.4.9.v20180320

球衣 2.26

【问题讨论】:

  • webjars/bootstrap 是否使用META-INF/resources 目录?另外,您的代码示例中ServletContextHandler 的基本资源路径声明在哪里?
  • 使用 META-INF/资源的 webjars/boostrap 是什么意思?此目录中没有任何内容。我以为 maven 会复制那里的资源

标签: java maven jersey embedded-jetty webjars


【解决方案1】:

bootstrap-&lt;ver&gt;.jar 有一个META-INF/resources/ 子目录。

$ jar -tvf bootstrap-4.0.0.jar | grep META-INF/resources
     0 Thu Jan 18 21:20:32 GMT 2018 META-INF/resources/
     0 Thu Jan 18 21:20:32 GMT 2018 META-INF/resources/webjars/
     0 Thu Jan 18 21:20:32 GMT 2018 META-INF/resources/webjars/bootstrap/
     0 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/
     0 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/
     0 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/
 43852 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-grid-jsf.css
  4076 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-grid-jsf.css.gz
 43852 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-grid.css
  4076 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-grid.css.gz
 95910 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-grid.css.map
 34243 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-grid.min-jsf.css
  3483 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-grid.min-jsf.css.gz
 34243 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-grid.min.css
  3483 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-grid.min.css.gz
 76209 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-grid.min.css.map
178152 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-jsf.css
 22410 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-jsf.css.gz
  4798 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-reboot-jsf.css
  1683 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-reboot-jsf.css.gz
  4798 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-reboot.css
  1683 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-reboot.css.gz
 57721 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-reboot.css.map
  3936 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-reboot.min-jsf.css
  1584 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-reboot.min-jsf.css.gz
  3936 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-reboot.min.css
  1584 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-reboot.min.css.gz
 25881 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap-reboot.min.css.map
178152 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap.css
 22410 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap.css.gz
411645 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap.css.map
144877 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap.min-jsf.css
 20563 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap.min-jsf.css.gz
144877 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap.min.css
 20563 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap.min.css.gz
551641 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/css/bootstrap.min.css.map
195855 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/bootstrap.bundle.js
 41578 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/bootstrap.bundle.js.gz
326634 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/bootstrap.bundle.js.map
 67742 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/bootstrap.bundle.min.js
 19244 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/bootstrap.bundle.min.js.gz
273872 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/bootstrap.bundle.min.js.map
115048 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/bootstrap.js
 20137 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/bootstrap.js.gz
195373 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/bootstrap.js.map
 48944 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/bootstrap.min.js
 13105 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/bootstrap.min.js.gz
161998 Thu Jan 18 11:29:48 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/js/bootstrap.min.js.map
   284 Thu Jan 18 21:20:32 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/webjars-requirejs.js
   182 Thu Jan 18 21:20:38 GMT 2018 META-INF/resources/webjars/bootstrap/4.0.0/webjars-requirejs.js.gz

这种 JAR 是一个 Web 资源 jar,对于 Jetty,它只有在使用完整的 WebAppContext 时才可用。

注意:使用 Jetty WebAppContext 时,所有 WEB-INF/lib/*.jar!/META-INF/resources/ 内容将被解压缩到一个临时目录中,以便 Jetty 可以提供这些特殊 jar 文件的内容。

您可以从这里获得一些选择(从最佳/最简单的选择到最复杂的顺序)。

  1. 已将您的 META-INF/resources jar 解压到您的资源目录中,然后通过类路径资源 URL 将其作为 ServletContextHandler 资源基位置引用。
  2. 使用您自己的代码将META-INF/resources 目录解压缩到一个临时目录中,然后将其用作ServletContextHandler 资源基目录。
  3. 改用完整的 WebAppContextwar 文件以及启用您想要使用的各种功能所需的所有额外配置。

注意,如果您的最终目标是to build a jetty uber jar,那么选项 1 将是总体上的最佳选择。

您所做的选择将取决于您最终希望如何打包您的项目。

  • 会是 1 个自执行 jar 吗?然后是选项 1。
  • 会是罐子的集合吗?那么选项 1 和 2 是不错的选择。
  • 它会是 jar 和 war 文件的集合吗?那么选项 3 是一个不错的选择。

基于META-INF/resources 的内容的最大问题是名称冲突解决。因此,我鼓励您使用选项 1,因为这将解决(在构建时)任何冲突解决问题。

例如:如果您有 2 个 JAR 文件,都带有 META-INF/resources/foo.css 文件(但内容不同),并且收到了对 http://&lt;host&gt;/foo.css 的请求,您为哪一个提供服务?

有关选项 1 的示例,请参阅 - https://github.com/jetty-project/embedded-jetty-with-web-resources

Eclipse Jetty 项目维护的一些嵌入式码头资源:

【讨论】:

  • 感谢您的回答。您是否有任何有关如何为嵌入式服务器设置嵌入式 WebAppContect 的资源?我需要 web.xml 吗?
  • 它还要求我为上下文设置一场战争
  • 更新的答案包含嵌入式码头文档和示例的链接
  • 我有点困惑。为什么我们需要指定一场战争?这不是要建造的吗?
  • 就像答案所说,整个META-INF/resources 概念是用于战争文件(又名WebAppContext)。您可以通过使用答案中的选项 1 或 2 完成 WebAppContext 在构建期间为您完成的工作来解决该要求。选择使用战争是最难/最困难/最工作的选择(正如答案中所指出的)
【解决方案2】:

您可以尝试添加ResourceHandler,例如:

ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setDirectoriesListed(false);
resourceHandler.setResourceBase(Main.class.getResource("META-INF/resources/webjars").toExternalForm());

ContextHandler webJarContext = new ContextHandler();
webJarContext.setContextPath("/webjars");
webJarContext.setHandler(resourceHandler);

【讨论】:

  • 这仅适用于第一个 META-INF/resources/webjars 类路径条目。不是其他人。
【解决方案3】:

正如 Joakim Erdfelt 所建议的,我使用 maven 将资源复制到目标类中。

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                        <id>unpack</id>
                        <phase>generate-test-sources</phase>
                        <goals>
                            <goal>unpack</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>org.webjars</groupId>
                                    <artifactId>swagger-ui</artifactId>
                                    <version>${swagger-ui.version}</version>                                    
                                    <type>jar</type>
                                    <includes>META-INF/resources/webjars/**/*</includes>
                                    <excludes>META-INF/resources/webjars/**/*index.html</excludes>
                                    <outputDirectory>${project.basedir}/target/classes/</outputDirectory>
                                    </artifactItem>
                                </artifactItems>
                            </configuration>
                        </execution>
                </executions>
            </plugin>   
        </plugins>
    </build>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
相关资源
最近更新 更多