返回

复活基于Slick2D的老游戏:解决依赖、构建与部署

java

复活一款基于Slick2D的老游戏

7年前,许多开发者利用Slick2D制作Java游戏,时光飞逝,重温经典成了当下一个有价值的话题。将这些老项目重新运行并加以Docker化,将极大地延长其生命周期,是一个相当不错的主意!下面来聊聊如何复活一个基于Slick2D开发的、拥有七年历史的老游戏项目。

老项目面临的挑战

直接尝试用IDE(例如Eclipse)运行老项目往往比较棘手。经过长时间的迭代,当初的开发环境早已不复存在,相关的项目依赖配置信息往往也没有详尽记录。即使找到相关的配置记录,当时的环境和工具可能已经废弃,造成难以预料的错误。对于这类项目,直接导入IDE运行一般不是好的选择。分析此类Slick2D老项目,依赖关系是需要优先确认的一个方面。如果代码仓库包含了.classpathpom.xml 文件,可以通过他们入手去识别老游戏所依赖的第三方库,否则可以检索工程内jar包的文件名等相关信息去分析。 另一个需要关注的方面是项目的构建方式,ant maven 或者其它方式,了解项目打包构建的方式有助于恢复其工作环境。同时还需要了解Slick2D和LWJGL依赖的版本,尝试查找 MANIFEST.MF 文件可能找到一些线索,结合代码注释和构建配置,尽可能恢复游戏的执行环境。

解决方案:逐步排查,各个击破

让这类七年多前的游戏运行并非难事,无非是解决运行时依赖问题。面对这种老项目,应该进行系统性的分析,采用分而治之的策略来处理问题。以下方案可以逐步将一个老项目恢复到可运行状态。

1. 使用特定版本的JRE运行

既然已经知道老游戏曾经运行在JRE 1.8.0_112版本上,可以使用这个特定版本去运行游戏。

操作步骤:

  1. 下载JRE 1.8.0_112。 可以从历史版本的Java SE开发工具包归档里找对应的jre版本,例如https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html,或者openjdk, https://jdk.java.net/archive/
  2. 配置Java环境变量 JAVA_HOMEPATH , 使用 java -version验证环境变量的有效性。
  3. 如果老项目是基于 jar 包启动,则可以使用命令行进入jar所在的目录,例如: java -jar yourgame.jar

代码示例:

假设 JRE 解压路径在 /path/to/jre1.8.0_112,通过bash来配置java执行环境:

export JAVA_HOME=/path/to/jre1.8.0_112
export PATH=$JAVA_HOME/bin:$PATH
java -version

确认java环境后即可用以下命令来执行游戏的启动jar。

java -jar yourgame.jar

需要注意Slick2D依赖 lwjgl 库。需要使用 -Djava.library.path 手动指定 lwjgl.jar 中的原生库 (dll 或 so)。

java -Djava.library.path=./native/ -jar yourgame.jar

如果游戏基于 applet 方式运行,建议改用 jar 包方式执行游戏。 applet 由于其安全风险以及逐渐减少的浏览器支持而不推荐作为首选。将游戏重构为桌面版可以兼容更多的平台,增强其可维护性。

2. 利用Maven重构项目依赖

通过 pom.xml,老项目可重新建立清晰的依赖关系。依赖管理让运行游戏更简易,是恢复和扩展老项目更可持续的方案。

操作步骤:

  1. 识别游戏的各个依赖,去Maven的中心仓库中确认版本号。 https://mvnrepository.com/ 可以搜索各种java库的依赖。
  2. 安装 maven,验证 maven 是否工作正常 mvn --version
  3. 创建 pom.xml 文件。
  4. 执行 mvn clean install

代码示例:

以一个包含Slick2D和lwjgl 2.9.3的老游戏工程为例:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yourgame</groupId>
    <artifactId>yourgame</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <dependencies>
        <dependency>
            <groupId>org.slick2d</groupId>
            <artifactId>slick2d-core</artifactId>
            <version>1.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.lwjgl.lwjgl</groupId>
            <artifactId>lwjgl</artifactId>
            <version>2.9.3</version>
        </dependency>
        <dependency>
             <groupId>org.lwjgl.lwjgl</groupId>
             <artifactId>lwjgl_util</artifactId>
             <version>2.9.3</version>
        </dependency>
        <!-- 其他依赖 -->
    </dependencies>

    <build>
        <plugins>
            <!-- 指定JDK版本 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <!-- Maven Assembly Plugin 用来构建"fat jars"-->
             <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                  <archive>
                    <manifest>
                        <!-- 这里要改为游戏的主类 -->
                      <mainClass>com.yourgame.Main</mainClass>
                    </manifest>
                  </archive>
                  <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                  </descriptorRefs>
                </configuration>
             </plugin>
        </plugins>
    </build>
</project>

此文件可以帮助用户在各种系统,各种Java开发环境去运行此老游戏。Maven 会自动处理各种jar包的依赖,极大地方便游戏部署到目标执行环境。 需要注意,需要安装指定JDK版本以及将 <mainClass> 设置为游戏的启动主类, mvn package 命令将生成可运行的游戏jar文件到 target 目录下,可以用之前提到的方式来运行游戏。

3. 采用Docker容器化部署

为确保游戏的执行环境保持稳定一致,可用容器技术部署该游戏。

操作步骤:

  1. 安装并验证 Docker
  2. 创建Dockerfile
  3. 编译生成镜像 docker build . -t yourgame:v1
  4. 创建并运行 Docker 容器 docker run -d -p 8080:8080 yourgame:v1

代码示例:

对于Slick2D游戏,以下是一个简单的示例Dockerfile。假设Maven构建好的游戏包为 yourgame-1.0-SNAPSHOT-jar-with-dependencies.jar

# 指定基础镜像
FROM openjdk:8u112-jdk

# 将游戏JAR复制到镜像
COPY target/yourgame-1.0-SNAPSHOT-jar-with-dependencies.jar /app.jar
COPY target/native /native

# 定义工作目录
WORKDIR /

# 配置项目启动命令,别忘了指定依赖
CMD ["java", "-Djava.library.path=./native/", "-jar", "/app.jar"]

Dockerfile里还可以定义更多的参数,例如数据卷和网络,来运行更复杂的应用程序,有兴趣的话可以详细了解Dockerfile。 构建和运行此Dockerfile 将启动该游戏并暴露出相应的网络端口。 Dockerized 的好处是可以极大降低运行环境差异的风险,用户不需要额外配置游戏所需要的各种前置依赖。只需要拉取镜像即可运行在各个平台,当然也可以选择云平台发布应用。这极大地简化了发布流程并保证各平台下游戏运行的一致性。

安全建议:
运行任何老项目时请关注运行安全方面,如果涉及在线内容和后端数据库服务, 请配置好安全加固方案。

  1. 更新所有已知漏洞的库到其对应安全的版本。
  2. 验证代码的完整性,例如执行checksum,确认运行文件未被篡改过。
  3. 对于一些不明确安全性的二进制文件, 可以在封闭环境下运行进行安全性测试。
  4. 网络方面,可以考虑配置相应的防火墙, VPN 或者API 网关来防止被攻击和安全加固你的执行环境.