曾几何时,我用 Windows 批处理文件编译 Java 项目。我记得每当我向项目中添加新包时,我都必须回去费力地编辑它们。
借助 Linux shell 的强大功能,您实际上可以制作一个体面的命令行构建脚本,而无需执行以下操作:
#!/bin/bash
set -e # quit on error
set -u # quit if we attempt to use undefined environment variable
set -x # show commands as they're executed (remove this line if done debugging)
# Run this script from the project root directory
cd src
# Create directory structure
find . -type d | xargs -n 1 -I I --verbose mkdir -p ../dist/class/I
# Use javac to compile files
find . -name "*.java" | javac @/dev/stdin -d ../dist/class
# Copy assets
find . -type f -and -not -name "*.java" | xargs -n 1 -I I --verbose cp I ../dist/class/I
# Jar command
jar cvf ../dist/$(basename $(readlink -f ..)) -C ../dist/class .
您应该将其保存在项目根目录中名为“build.sh”的文件中。此脚本缺少一些功能。有很多冗长,所以你可以确切地看到发生了什么。它不能很好地处理带有空格或其他奇怪字符的文件名。如果您想要一个可运行的 jar 文件,则必须编写一个清单文件并将其包含在“jar”命令中。如果您的项目使用 Java 类库之外的任何外部依赖项,则必须将 -cp 开关添加到 javac 命令行,或导出 CLASSPATH 环境变量。
上面的脚本会将资产复制到 jar 文件中。假设您在运行时提取资产,这将进行一个文件分发。Stackoverflow 可以告诉您有关如何在 Java 中的虚拟文件系统中处理单个文件中的资产的更多信息。
作为替代方案,您可以简单地将资产从源目录复制到目标目录。
作为风格问题,大多数人将他们的资产保存在与源代码不同的目录中。例如,您的两个 .gif 文件将位于 assets/app/images 而不是 src/app/images 下。只要你能说服你的构建系统做你想做的事,在技术上没有必要这样做,但我见过的大多数项目都将它们分开。