如何将 jar 文件部署到 azure?
how to deploy jar file to azure?
我使用 grizzly 和 google guice 创建了一个 RESTFul 服务。我可以在命令行上访问它 运行:
c:\Java\src\options\console>java -jar target\ServerConsole-V1.jar
Nov 28, 2017 3:18:01 PM org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
web server started successfully at http://localhost:8080/
...press any key to stop the process
现在我想把这个服务部署到云端。我找到了有关部署 SpringBoot 应用程序和使用 jar 文件创建网络作业的文章,但其中 none 适用于我的应用程序的工作方式。
我是否需要重新设计 Web 服务器(以 spring 启动)或者我可以按原样部署它吗?如果可以,怎么做?
谢谢,马特
编辑:
我已经按照下面的 Jay 步骤进行操作。我创建了一个 web.config 作为
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
</handlers>
<httpPlatform processPath="%JAVA_HOME%\bin\java.exe"
arguments="-Djava.net.preferIPv4Stack=true -Dserver.port=8080 -jar "%HOME%\site\wwwroot\ServerConsole-V1.jar"">
</httpPlatform>
</system.webServer>
</configuration>
当我尝试使用浏览器或 PostMan 访问 RESTFul API 时,出现超时错误。我该如何诊断?
下面是 运行 Azure 服务器上的 .jar 文件的教程。您可以使用 Azure 的 Web 服务,它为您提供 java 应用程序所需的 java 环境和 Web 服务器。
Running java jar file to serve web requests on Azure App Service Web Apps
根据您的描述,您的情况类似于部署jar包到azure Web App。
我上传了一个 spring-boot 项目作为如何将 jar 部署到 Azure Web 应用程序的示例。
要点1:请使用mvn package
在[=12=所在目录下构建JAR包] 文件所在。
]
要点2:请确保web.config中配置的jar包名称与上传的jar相同包名。
web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
</handlers>
<httpPlatform processPath="%JAVA_HOME%\bin\java.exe"
arguments="-Djava.net.preferIPv4Stack=true -Dserver.port=%HTTP_PLATFORM_PORT% -jar "%HOME%\site\wwwroot\<your jar name>"">
</httpPlatform>
</system.webServer>
</configuration>
要点3:请使用FTP将jar files
和web.config
发布到KUDU上的D:\home\site\wwwroot\
目录。
第4点:请确保ApplicationSettings
与您的项目相匹配,例如jdk version
,tomcat version
.
希望对你有帮助。
你不用重新架构你的app,grizzly会运行就好了,唯一的问题是文档不够清晰。
run.jar 教程很有帮助,但在部署基于 grizzly 的应用程序时缺少两个关键点。
我使用的 Maven 配置与用于部署 Spring 启动应用程序的配置类似。
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-webapp-maven-plugin</artifactId>
<version>1.9.0</version>
<configuration>
<schemaVersion>V2</schemaVersion>
<resourceGroup>Your_apps_resource_group_name</resourceGroup>
<appName>Your-app-name</appName>
<region>eastus2</region>
<pricingTier>F1</pricingTier>
<runtime>
<os>linux</os>
<javaVersion>jre8</javaVersion>
<webContainer>jre8</webContainer>
</runtime>
<!-- Begin of App Settings -->
<appSettings>
<property>
<name>JAVA_OPTS</name>
<value>-Dserver.port=80 -Djava.net.preferIPv4Stack=true</value>
</property>
</appSettings>
<!-- End of App Settings -->
<deployment>
<resources>
<resource>
<directory>${project.basedir}/target</directory>
<includes>
<include>*.jar</include>
</includes>
</resource>
</resources>
</deployment>
</configuration>
</plugin>
这里的关键是JAVA_OPTS 属性值
-Dserver.port=80 -Djava.net.preferIPv4Stack=true
应用程序将 运行 连接在 Azure 容器上,该容器在启动时会随机分配服务器端口,因此 grizzly 的常规 8080 在 99.9999% 的情况下都无法正常工作。
为了设置你需要获取系统的端口属性
public static void main(String[] args) throws IOException, ServletException {
String port = "8080";
if (!Objects.isNull(System.getProperty("server.port"))) {
port = System.getProperty("server.port");
}
System.out.println("Using server port " + port);
String host = "0.0.0.0";
final String baseUri = String.format("http://%s:%s/", host, port);
startServer(baseUri);
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sapplication.wadl%nHit enter to stop it...", baseUri));
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sswagger.json%nHit enter to stop it...", baseUri));
}
这里的另一个关键是,为了 运行 在容器内并绑定 IP 地址,grizzly 需要从 0.0.0.0 开始而不是本地主机(What is the difference between 0.0.0.0, 127.0.0.1 and localhost?)
启动服务器方法接收基本 URI 而不是使用私有静态 URI,如下所示。
public static HttpServer startServer(final String baseUri) throws ServletException {
WebappContext webAppContext = new WebappContext(
"GrizzlyContext", "/");
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(baseUri));
CLStaticHttpHandler staticHttpHandler
= new CLStaticHttpHandler(Main.class.getClassLoader(),"/www/");
server.getServerConfiguration().addHttpHandler(staticHttpHandler,"/");
webAppContext.deploy(server);
return server;
}
也许自从写了@Jinesh 提到的那个教程后事情发生了变化,但我发现没有必要 web.config。
我遵循的步骤是:
- 在 Azure 中创建应用服务,将 Web 服务器选择为“Java SE(嵌入式 Web 服务器)”
- 将您的 jar 文件上传到 /home/site/wwwroot 文件夹
- 在常规设置页面,设置启动命令为
java -jar /home/site/wwwroot/xxxx.jar
- 在应用程序设置页面中,将 PORT 设置为您的应用程序将侦听的端口号
这些说明基于本教程
https://blog.zuehlke.cloud/2020/03/simple-java-app-jar-in-azure-appservice/
我使用 grizzly 和 google guice 创建了一个 RESTFul 服务。我可以在命令行上访问它 运行:
c:\Java\src\options\console>java -jar target\ServerConsole-V1.jar
Nov 28, 2017 3:18:01 PM org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
web server started successfully at http://localhost:8080/
...press any key to stop the process
现在我想把这个服务部署到云端。我找到了有关部署 SpringBoot 应用程序和使用 jar 文件创建网络作业的文章,但其中 none 适用于我的应用程序的工作方式。
我是否需要重新设计 Web 服务器(以 spring 启动)或者我可以按原样部署它吗?如果可以,怎么做?
谢谢,马特
编辑: 我已经按照下面的 Jay 步骤进行操作。我创建了一个 web.config 作为
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
</handlers>
<httpPlatform processPath="%JAVA_HOME%\bin\java.exe"
arguments="-Djava.net.preferIPv4Stack=true -Dserver.port=8080 -jar "%HOME%\site\wwwroot\ServerConsole-V1.jar"">
</httpPlatform>
</system.webServer>
</configuration>
当我尝试使用浏览器或 PostMan 访问 RESTFul API 时,出现超时错误。我该如何诊断?
下面是 运行 Azure 服务器上的 .jar 文件的教程。您可以使用 Azure 的 Web 服务,它为您提供 java 应用程序所需的 java 环境和 Web 服务器。
Running java jar file to serve web requests on Azure App Service Web Apps
根据您的描述,您的情况类似于部署jar包到azure Web App。 我上传了一个 spring-boot 项目作为如何将 jar 部署到 Azure Web 应用程序的示例。
要点1:请使用mvn package
在[=12=所在目录下构建JAR包] 文件所在。
要点2:请确保web.config中配置的jar包名称与上传的jar相同包名。
web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
</handlers>
<httpPlatform processPath="%JAVA_HOME%\bin\java.exe"
arguments="-Djava.net.preferIPv4Stack=true -Dserver.port=%HTTP_PLATFORM_PORT% -jar "%HOME%\site\wwwroot\<your jar name>"">
</httpPlatform>
</system.webServer>
</configuration>
要点3:请使用FTP将jar files
和web.config
发布到KUDU上的D:\home\site\wwwroot\
目录。
第4点:请确保ApplicationSettings
与您的项目相匹配,例如jdk version
,tomcat version
.
希望对你有帮助。
你不用重新架构你的app,grizzly会运行就好了,唯一的问题是文档不够清晰。
run.jar 教程很有帮助,但在部署基于 grizzly 的应用程序时缺少两个关键点。
我使用的 Maven 配置与用于部署 Spring 启动应用程序的配置类似。
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-webapp-maven-plugin</artifactId>
<version>1.9.0</version>
<configuration>
<schemaVersion>V2</schemaVersion>
<resourceGroup>Your_apps_resource_group_name</resourceGroup>
<appName>Your-app-name</appName>
<region>eastus2</region>
<pricingTier>F1</pricingTier>
<runtime>
<os>linux</os>
<javaVersion>jre8</javaVersion>
<webContainer>jre8</webContainer>
</runtime>
<!-- Begin of App Settings -->
<appSettings>
<property>
<name>JAVA_OPTS</name>
<value>-Dserver.port=80 -Djava.net.preferIPv4Stack=true</value>
</property>
</appSettings>
<!-- End of App Settings -->
<deployment>
<resources>
<resource>
<directory>${project.basedir}/target</directory>
<includes>
<include>*.jar</include>
</includes>
</resource>
</resources>
</deployment>
</configuration>
</plugin>
这里的关键是JAVA_OPTS 属性值
-Dserver.port=80 -Djava.net.preferIPv4Stack=true
应用程序将 运行 连接在 Azure 容器上,该容器在启动时会随机分配服务器端口,因此 grizzly 的常规 8080 在 99.9999% 的情况下都无法正常工作。
为了设置你需要获取系统的端口属性
public static void main(String[] args) throws IOException, ServletException {
String port = "8080";
if (!Objects.isNull(System.getProperty("server.port"))) {
port = System.getProperty("server.port");
}
System.out.println("Using server port " + port);
String host = "0.0.0.0";
final String baseUri = String.format("http://%s:%s/", host, port);
startServer(baseUri);
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sapplication.wadl%nHit enter to stop it...", baseUri));
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sswagger.json%nHit enter to stop it...", baseUri));
}
这里的另一个关键是,为了 运行 在容器内并绑定 IP 地址,grizzly 需要从 0.0.0.0 开始而不是本地主机(What is the difference between 0.0.0.0, 127.0.0.1 and localhost?)
启动服务器方法接收基本 URI 而不是使用私有静态 URI,如下所示。
public static HttpServer startServer(final String baseUri) throws ServletException {
WebappContext webAppContext = new WebappContext(
"GrizzlyContext", "/");
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(baseUri));
CLStaticHttpHandler staticHttpHandler
= new CLStaticHttpHandler(Main.class.getClassLoader(),"/www/");
server.getServerConfiguration().addHttpHandler(staticHttpHandler,"/");
webAppContext.deploy(server);
return server;
}
也许自从写了@Jinesh 提到的那个教程后事情发生了变化,但我发现没有必要 web.config。
我遵循的步骤是:
- 在 Azure 中创建应用服务,将 Web 服务器选择为“Java SE(嵌入式 Web 服务器)”
- 将您的 jar 文件上传到 /home/site/wwwroot 文件夹
- 在常规设置页面,设置启动命令为
java -jar /home/site/wwwroot/xxxx.jar
- 在应用程序设置页面中,将 PORT 设置为您的应用程序将侦听的端口号
这些说明基于本教程 https://blog.zuehlke.cloud/2020/03/simple-java-app-jar-in-azure-appservice/