两周前,我们研究了如何用Java webapps取代桌面Java应用程序 。 现在是时候考虑分发此类桌面 Web应用程序了。

目前的趋势是使用Docker 。 我认为读者至少对这项技术很熟悉。 最简单的方法是创建WAR并将其交付到Tomcat映像中。 另一种选择是按照上一篇文章创建一个嵌入了Tomcat的胖JAR,然后在仅具有JRE的映像中运行它。



决定因素之一是所得图像的大小。 有趣的是,第二个选项是最佳选择,因为Tomcat嵌入式是常规发行版的精简版本。



关于大小要获得最小的映像,应该选择基于Alpine Linux的容器,而不是更完整的Linux发行版(例如Debian)。 要进一步缩小图像,请使用jlink,它是Java 9的一部分。不幸的是,在撰写本文时,Alpine还没有JRE 9图像。 另一种节省几千字节的方法是用Jetty替换嵌入式Tomcat:

pom.xml <dependency> <groupId> org.springframework.boot </ groupId> <artifactId> vaadin-spring-boot-starter </ 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-jetty </ artifactId> </ dependency>



可能的Dockerfile可能如下所示:



Docker文件



FROM openjdk:8-jre-alpine

ARG JAR_FILE
ADD ${JAR_FILE} /usr/share/renamer.jar

ENTRYPOINT ["/usr/bin/java", "-jar", "/usr/share/renamer.jar"]



有了它,就可以创建相对可接受大小的图像:



nfrankel/renamer 0.0.1-SNAPSHOT f8ed5f177771 38 minutes ago 113MB



对于Maven集成,我使用Spotify中的dockerfile-maven-plugin 。 这是一个如何使用它的示例:



pom.xml



<plugin>
  <groupId> com.spotify </groupId>
  <artifactId> dockerfile-maven-plugin </artifactId>
  <version> 1.4.0 </version>
  <executions>
    <ecution>
      <id> default </id>
      <goals>
        <goal> build </goal>
        <goal> push </goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <repository> nfrankel/renamer </repository>
    <tag> ${project.version} </tag>
    <buildArgs>
      <JAR_FILE> target/${project.build.finalName}.${project.packaging} </JAR_FILE>
    </buildArgs>
  </configuration>
</plugin>



生成映像后,启动容器很简单:



docker run-ti-p 8080:8080 -v /tmp/foo:/tmp/foo nfrankel/renamer:0.0.1-SNAPSHOT



映射端口很常见。 如果应用程序需要与文件系统进行交互(就像某些(大多数?)桌面应用程序一样),则还需要映射卷。



至此,所有设置均已启动。 但是,一个新问题浮出水面:“如何在Docker中启动浏览器?”



Docker无法在主机系统上打开浏览器。 解决方法是在映像中安装浏览器,启动它,然后通过X11在主机上显示它。 但是,这样做有两个缺点:



  1. 这不是小事。 在我的Mac上,它要求:
  • 安装用于X11仿真(XQuartz)的专用软件
  • 所述软件的配置
  • 传递其他参数以使Docker运行:
docker run-ti-eDISPLAY= 192.168.1.73:0 -p 8080:8080  -v /tmp/.X11-unix:/tmp/.X11-unix nfrankel/renamer:0.0.1-SNAPSHOT
  1. 它大大增加了图像的大小!

最后,最好让它离开图像,并创建简单的多平台脚本来实现相同目的。



SonarQube发行版就是一个很好的例子。 它提供以下操作系统的脚本:Linux 32位和64位OSX Windows 32位和64位



结论



Docker是分发嵌入servlet的Web应用程序的好方法。 但是,它与桌面系统集成不是很好,因为与主机系统进行交互并不容易。


可以在Github上以Maven格式找到此文章的完整源代码。


翻译自: https://blog.frankel.ch/distributing-desktop-webapps/1/