带有 undertow 的 Jhipster 可执行 jar 不起作用 - 404
Jhipster executable jar with undertow does not work - 404
我构建了一个 jhipster 应用程序。添加了一个实体。使用
构建
mvn -Pprod package
当我使用
时,应用 运行 与 tomcat 没问题
java -jar xyz.war
但是,由于我们需要 Undertow 来实现高负载场景和快速启动时间,我只是将 Maven 依赖项从 Tomcat 更改为 Undertow 在 tomcat starter 的所有地方(所有配置文件)根据 Spring 文档提到了依赖性:Using Undertow in Place of Tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
当来自 Eclipse 的 运行 时,这 运行 很好,我可以看到请求现在由 Undertow 而不是 Tomcat 提供服务,因为日志将 XNIO 打印为线程 ID。
但是,当我再次构建它并尝试 运行 它时 java -jar xyz.war
,
应用程序启动正常,但当我点击 URL 时
http://127.0.0.1:8081
它说没有找到。
我还需要做什么才能使嵌入了 Undertow 的 jHipster 应用程序正常工作?
任何快速帮助被视为在我们组织中推动 jHipster 的关键 POC 都取决于此步骤。
我们过去支持 Undertow,但最近将其删除。所以你应该不会有太多的麻烦来设置它(你所做的看起来不错,然后你没有 post 你的整个配置所以很难说)。
无论如何,关于您的具体用例,您需要知道我们为什么删除 Undertow:
- 启动时间确实缩短了大约 300-500 毫秒。我们主要在 "dev" 配置文件中使用它,因为启动时间很重要。但是现在我们有了 Spring Dev Tools 热重启,这根本就没用了。
- 对于 "prod" 用法,我没有发现 Tomcat 和 Undertow 之间有任何性能差异。与仅一次数据库访问(花费数毫秒)相比,我想您看不到这种改进。
此外,我们删除了 Undertow,因为它缺少一些对我们来说很重要的功能。最重要的是:
- GZip 压缩支持 -> 因为你会失去这个,你的性能实际上会比 Tomcat
更差
- Websocket 支持
最后但同样重要的是,通过添加新节点很容易扩展 JHipster 应用程序(在 JHipster 3.0 中会更容易),因此处理大量用户应该不是问题。
我没能解决你的错误。 Undertow 似乎很适合我。
1) 我生成了一个新的 JHipster 项目(来自 master),所有默认选项
2) 我仅在 pom.xml 的这一部分将 tomcat 替换为 undertow :
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- log configuration -->
<logback.loglevel>DEBUG</logback.loglevel>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</profile>
<profile>
<id>prod</id>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
</dependencies>
3) 构建:
mvn package -Pprod
4) 启动数据库:
docker-compose -f src/main/docker/prod.yml up -d
5) 启动应用程序
java -jar target/*.war --spring.profiles.active=prod
:: JHipster :: Running Spring Boot 1.3.2.RELEASE ::
:: http://jhipster.github.io ::
2016-02-22 00:18:40.051 INFO 6118 --- [ main] com.mycompany.myapp.JhundertowApp : Starting JhundertowApp on pgrXps with PID 6118 (started by pgrimaud in /home/pgrimaud/workspace/tests2/32-undertow)
2016-02-22 00:18:40.054 INFO 6118 --- [ main] com.mycompany.myapp.JhundertowApp : The following profiles are active: prod
2016-02-22 00:18:44.024 WARN 6118 --- [ main] io.undertow.websockets.jsr : UT026009: XNIO worker was not set on WebSocketDeploymentInfo, the default worker will be used
2016-02-22 00:18:44.126 WARN 6118 --- [ main] io.undertow.websockets.jsr : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2016-02-22 00:18:44.742 INFO 6118 --- [ main] c.mycompany.myapp.config.WebConfigurer : Web application configuration, using profiles: [prod]
6) 我更改登录应用程序以确认它使用 undertow
----------------------------------------------------------
Application 'jhundertow' is running! Access URLs:
Local: http://127.0.0.1:8080
External: http://127.0.1.1:8080
----------------------------------------------------------
2016-02-22 00:20:20.585 TRACE 6118 --- [ XNIO-2 task-31] c.m.m.c.l.AngularCookieLocaleResolver : Parsed cookie value [%22en%22] into locale 'en'
2016-02-22 00:20:25.741 TRACE 6118 --- [ XNIO-2 task-32] c.m.m.c.l.AngularCookieLocaleResolver : Parsed cookie value [%22en%22] into locale 'en'
对我来说幸运的是,当我将同一个 war 文件移动到 RHEL 系统时,它工作得很好。 :-) 我接受@pgrimaud 的回答。感谢@deepu 和@Julien。你们真棒。
我会调查我的 Win7 机器出了什么问题 - 如果我能弄清楚,我会 post 回到这里。 (npm clear cache dint 帮助。将重新安装 node.js 和 npm,因为我已经为我的其他 node.js 工作更新了它们 - 我会看看是否有帮助)。我也会尝试调试 spring-boot-starter-undertow.
终于,克星的解决方案就位了。这是我的更新 - 今天,我开始调试 spring 引导和 undertow 代码并意识到 spring 引导正在以下位置寻找资源:
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/" };
之后,我在 META-INF 目录中创建了一个名为 resources 的文件夹,并使用 7zip 复制了其中的所有资源。 瞧瞧,它起作用了! :-).
尽管 spring 引导也应该从
加载资源
private static final String[] SERVLET_RESOURCE_LOCATIONS = { "/" };
出于某种原因,它没有这样做。 (这是 jHipster 放置所有资源文件的地方)
我认为这是 jHipster 使用的 spring 引导版本的错误,我将我的应用程序 spring 引导版本升级到 1.3.3.RELEASE
,但这也无济于事。
我构建了一个 jhipster 应用程序。添加了一个实体。使用
构建mvn -Pprod package
当我使用
时,应用 运行 与 tomcat 没问题java -jar xyz.war
但是,由于我们需要 Undertow 来实现高负载场景和快速启动时间,我只是将 Maven 依赖项从 Tomcat 更改为 Undertow 在 tomcat starter 的所有地方(所有配置文件)根据 Spring 文档提到了依赖性:Using Undertow in Place of Tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
当来自 Eclipse 的 运行 时,这 运行 很好,我可以看到请求现在由 Undertow 而不是 Tomcat 提供服务,因为日志将 XNIO 打印为线程 ID。
但是,当我再次构建它并尝试 运行 它时 java -jar xyz.war
,
应用程序启动正常,但当我点击 URL 时
http://127.0.0.1:8081
它说没有找到。
我还需要做什么才能使嵌入了 Undertow 的 jHipster 应用程序正常工作?
任何快速帮助被视为在我们组织中推动 jHipster 的关键 POC 都取决于此步骤。
我们过去支持 Undertow,但最近将其删除。所以你应该不会有太多的麻烦来设置它(你所做的看起来不错,然后你没有 post 你的整个配置所以很难说)。 无论如何,关于您的具体用例,您需要知道我们为什么删除 Undertow:
- 启动时间确实缩短了大约 300-500 毫秒。我们主要在 "dev" 配置文件中使用它,因为启动时间很重要。但是现在我们有了 Spring Dev Tools 热重启,这根本就没用了。
- 对于 "prod" 用法,我没有发现 Tomcat 和 Undertow 之间有任何性能差异。与仅一次数据库访问(花费数毫秒)相比,我想您看不到这种改进。
此外,我们删除了 Undertow,因为它缺少一些对我们来说很重要的功能。最重要的是:
- GZip 压缩支持 -> 因为你会失去这个,你的性能实际上会比 Tomcat 更差
- Websocket 支持
最后但同样重要的是,通过添加新节点很容易扩展 JHipster 应用程序(在 JHipster 3.0 中会更容易),因此处理大量用户应该不是问题。
我没能解决你的错误。 Undertow 似乎很适合我。
1) 我生成了一个新的 JHipster 项目(来自 master),所有默认选项
2) 我仅在 pom.xml 的这一部分将 tomcat 替换为 undertow :
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- log configuration -->
<logback.loglevel>DEBUG</logback.loglevel>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</profile>
<profile>
<id>prod</id>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
</dependencies>
3) 构建:
mvn package -Pprod
4) 启动数据库:
docker-compose -f src/main/docker/prod.yml up -d
5) 启动应用程序
java -jar target/*.war --spring.profiles.active=prod
:: JHipster :: Running Spring Boot 1.3.2.RELEASE ::
:: http://jhipster.github.io ::
2016-02-22 00:18:40.051 INFO 6118 --- [ main] com.mycompany.myapp.JhundertowApp : Starting JhundertowApp on pgrXps with PID 6118 (started by pgrimaud in /home/pgrimaud/workspace/tests2/32-undertow)
2016-02-22 00:18:40.054 INFO 6118 --- [ main] com.mycompany.myapp.JhundertowApp : The following profiles are active: prod
2016-02-22 00:18:44.024 WARN 6118 --- [ main] io.undertow.websockets.jsr : UT026009: XNIO worker was not set on WebSocketDeploymentInfo, the default worker will be used
2016-02-22 00:18:44.126 WARN 6118 --- [ main] io.undertow.websockets.jsr : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2016-02-22 00:18:44.742 INFO 6118 --- [ main] c.mycompany.myapp.config.WebConfigurer : Web application configuration, using profiles: [prod]
6) 我更改登录应用程序以确认它使用 undertow
----------------------------------------------------------
Application 'jhundertow' is running! Access URLs:
Local: http://127.0.0.1:8080
External: http://127.0.1.1:8080
----------------------------------------------------------
2016-02-22 00:20:20.585 TRACE 6118 --- [ XNIO-2 task-31] c.m.m.c.l.AngularCookieLocaleResolver : Parsed cookie value [%22en%22] into locale 'en'
2016-02-22 00:20:25.741 TRACE 6118 --- [ XNIO-2 task-32] c.m.m.c.l.AngularCookieLocaleResolver : Parsed cookie value [%22en%22] into locale 'en'
对我来说幸运的是,当我将同一个 war 文件移动到 RHEL 系统时,它工作得很好。 :-) 我接受@pgrimaud 的回答。感谢@deepu 和@Julien。你们真棒。
我会调查我的 Win7 机器出了什么问题 - 如果我能弄清楚,我会 post 回到这里。 (npm clear cache dint 帮助。将重新安装 node.js 和 npm,因为我已经为我的其他 node.js 工作更新了它们 - 我会看看是否有帮助)。我也会尝试调试 spring-boot-starter-undertow.
终于,克星的解决方案就位了。这是我的更新 - 今天,我开始调试 spring 引导和 undertow 代码并意识到 spring 引导正在以下位置寻找资源:
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/" };
之后,我在 META-INF 目录中创建了一个名为 resources 的文件夹,并使用 7zip 复制了其中的所有资源。 瞧瞧,它起作用了! :-).
尽管 spring 引导也应该从
加载资源private static final String[] SERVLET_RESOURCE_LOCATIONS = { "/" };
出于某种原因,它没有这样做。 (这是 jHipster 放置所有资源文件的地方)
我认为这是 jHipster 使用的 spring 引导版本的错误,我将我的应用程序 spring 引导版本升级到 1.3.3.RELEASE
,但这也无济于事。