在 Azure 上部署 maven web



情况:我有一个本地环境,我将Web应用程序部署到vanilla tomcat服务器。应用程序按预期运行。我部署到 Azure,并在部署期间获得 NPE。Azure tomcat 服务器也应该是香草。

问题是,当两个环境假设相同时,为什么我会在一个环境中获得 NPE 阻止应用程序运行,而不是在不同的环境中获得相同的 NPE?我会从哪里开始寻找?

或者换一种说法: 为什么container.addServlet("dispatcher", new DispatcherServlet(ctx((在生产环境中返回空"如果这个ServletContext已经包含给定servletName的完整ServletRegistration"?当它在我的本地/开发环境中不这样做时。

Java新手,Azure新手,深陷困境。 将 eclipse 与 azure 工具包插件结合使用。

Web应用程序在本地tomcat服务器上运行得很好。与部署在 azure 上的 mysql 数据库对话很好。

我尝试部署到 Azure。 它说它已正确发布,但我收到 404 错误。无法弄清楚如何让日志记录在 Azure 上正常工作,但能够让流正常工作。复制流并花费大量时间格式化输出后,这是部署时发生的唯一错误:

07-Feb-2020 05:57:32.426 SEVERE [main] org.apache.catalina.startup.HostConfig.deployDirectory Error deploying web application directory [D:homesitewwwrootwebappshds]java.lang.IllegalStateException: Error starting child
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:716)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:695)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1133)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1868)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1045)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:429)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1577)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:424)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:367)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:934)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1382)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1372)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:907)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:423)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:933)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.startup.Catalina.start(Catalina.java:637)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/hds]]
at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:713)... 37 moreCaused by: java.lang.NullPointerException
at hds.configs.ApplicationInitializer.onStartup(ApplicationInitializer.java:21)
at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:172)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5120)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)... 38 more

有趣的部分似乎是:

at hds.configs.ApplicationInitializer.onStartup(ApplicationInitializer.java:21)

这是"违规"代码:

public class ApplicationInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext container) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(WebMvcConfig.class);
ctx.setServletContext(container);
ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx));
//servlet.setLoadOnStartup(1);
servlet.setLoadOnStartup(-1);
servlet.addMapping("/");
}
}

代码的第 21 行是: ''' servlet.setLoadOnStartup(-1(; '''

如果你需要WebMvcConfig.class:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "hds.controllers,hds.daos,hds.services,hds.configs")
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setViewClass(JstlView.class);
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}

@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasename("messages");
return source;
}
@Override
public Validator getValidator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.setValidationMessageSource(messageSource());
return validator;
}
}

我不知道为什么这会生成此错误。就像我之前说的,我对java和Azure非常陌生,并且完全披露这是大学顶点项目的一部分。创建一个网站而不是CMS并将其绑定到数据库是奖励。

如果有人可以告诉我如何在 azure 上运行日志,那将很有帮助。我继续获取一个存储帐户并打开日志,但我不知道如何访问它们。

我尝试使用天蓝色的支持,虽然这位绅士很好,但他显然超出了他的深度。

就像我说的那样,在本地运行得很好,配置几乎是样板(我认为基于我的研究(。

在 Azure 应用服务中,可以在不同版本的 Tomcat 之间进行选择,请确保目标版本与要测试的版本相同。

如果仍然遇到问题,请创建 Azure 支持请求,我们将协助: https://learn.microsoft.com/en-us/azure/azure-portal/supportability/how-to-create-azure-support-request

在以下链接中,你将了解如何在应用服务上为 Web 应用启用日志,以及如何使用门户或 CLI 流式传输日志: https://learn.microsoft.com/en-us/azure/app-service/troubleshoot-diagnostic-logs

您可以使用 FTP 下载日志: https://learn.microsoft.com/en-us/azure/app-service/deploy-ftp#get-ftp-connection-information

日志应位于/site/LogFiles 文件夹中。

最新更新