Skip to content

Commit 7a10c12

Browse files
committed
version.txt at project root is packaged
1 parent 38b341a commit 7a10c12

4 files changed

Lines changed: 49 additions & 12 deletions

File tree

src/main/java/airhacks/App.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package airhacks;
22

33
import java.io.IOException;
4+
import java.nio.file.Path;
45

56
import java.util.Optional;
67

@@ -54,7 +55,7 @@ static void build(AppArguments arguments) throws IOException {
5455
var jarDirectory = arguments.jarDirectory();
5556
var jarFileName = arguments.jarFileName();
5657

57-
Packer.createJAR(classesDirectory, resourcesDirectory, jarDirectory, jarFileName,relativeMainClass);
58+
Packer.createJAR(Path.of("."), classesDirectory, resourcesDirectory, jarDirectory, jarFileName,relativeMainClass);
5859
if (arguments.isClassesDirTemporary()) {
5960
Cleaner.cleanClasses(classesDirectory);
6061
}

src/main/java/airhacks/zb/packer/control/Packer.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@ public interface Packer {
1717

1818
String VERSION_FILE = "version.txt";
1919

20-
static void createJAR(Path rootClassesDirectory, Optional<Path> rootResourcesDirectory, Path rootJARDirectory, String jarFileName, Optional<Path> mainClass) throws IOException {
20+
static void createJAR(Path projectRoot, Path rootClassesDirectory, Optional<Path> rootResourcesDirectory, Path rootJARDirectory, String jarFileName, Optional<Path> mainClass) throws IOException {
2121
var jarFile = rootJARDirectory.resolve(jarFileName);
2222
Files.createDirectories(rootJARDirectory);
2323
Files.deleteIfExists(jarFile);
2424

25-
var version = rootResourcesDirectory.flatMap(Packer::readVersion);
25+
var versionFile = locateVersionFile(projectRoot, rootResourcesDirectory);
26+
var version = versionFile.flatMap(Packer::readVersionContent);
2627

2728
try (var fos = Files.newOutputStream(jarFile, StandardOpenOption.CREATE_NEW);
2829
var jos = new JarOutputStream(fos)) {
@@ -37,24 +38,44 @@ static void createJAR(Path rootClassesDirectory, Optional<Path> rootResourcesDir
3738
var dir = rootResourcesDirectory.get();
3839
try (var paths = Files.walk(dir)) {
3940
paths.filter(Files::isRegularFile)
41+
.filter(path -> !path.equals(dir.resolve(VERSION_FILE)))
4042
.forEach(path -> addEntry(dir, jos, path));
4143
}
4244
}
45+
versionFile.ifPresent(file -> addVersionEntry(jos, file));
4346
}
4447
}
4548

46-
static Optional<String> readVersion(Path resourcesDirectory) {
47-
var versionFile = resourcesDirectory.resolve(VERSION_FILE);
48-
if (!Files.isRegularFile(versionFile)) {
49-
return Optional.empty();
49+
static Optional<Path> locateVersionFile(Path projectRoot, Optional<Path> resourcesDirectory) {
50+
var rootCandidate = projectRoot.resolve(VERSION_FILE);
51+
if (Files.isRegularFile(rootCandidate)) {
52+
return Optional.of(rootCandidate);
5053
}
54+
return resourcesDirectory
55+
.map(dir -> dir.resolve(VERSION_FILE))
56+
.filter(Files::isRegularFile);
57+
}
58+
59+
static Optional<String> readVersion(Path projectRoot, Optional<Path> resourcesDirectory) {
60+
return locateVersionFile(projectRoot, resourcesDirectory).flatMap(Packer::readVersionContent);
61+
}
62+
63+
static Optional<String> readVersionContent(Path versionFile) {
5164
try {
5265
return Optional.of(Files.readString(versionFile).trim());
5366
} catch (IOException e) {
5467
return Optional.empty();
5568
}
5669
}
5770

71+
static void addVersionEntry(JarOutputStream jos, Path versionFile) {
72+
try {
73+
addEntry(jos, Path.of(VERSION_FILE), Files.readAllBytes(versionFile));
74+
} catch (IOException e) {
75+
throw new RuntimeException("Failed to add version.txt to JAR: " + versionFile, e);
76+
}
77+
}
78+
5879
static void addManifest(Path rootClassesDirectory, JarOutputStream jos, Path mainClass, Optional<String> version) {
5980
var javaPackage = pathToJavaPackage(mainClass);
6081
var fullyQualifiedClassName = javaPackage.replace(".java", "");

src/main/resources/version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2026.05.26.01
1+
2026.05.26.02

src/test/java/airhacks/zb/packer/control/PackerTest.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,30 @@ void pathToJavaPackage() {
3131
}
3232

3333
@Test
34-
void readVersionWhenPresent(@TempDir Path resources) throws IOException {
34+
void readVersionFromResourcesWhenRootMissing(@TempDir Path projectRoot, @TempDir Path resources) throws IOException {
3535
Files.writeString(resources.resolve("version.txt"), "2026.04.26.01\n");
36-
var version = Packer.readVersion(resources);
36+
var version = Packer.readVersion(projectRoot, Optional.of(resources));
3737
assertThat(version).contains("2026.04.26.01");
3838
}
3939

4040
@Test
41-
void readVersionWhenAbsent(@TempDir Path resources) {
42-
var version = Packer.readVersion(resources);
41+
void readVersionFromProjectRootPreferredOverResources(@TempDir Path projectRoot, @TempDir Path resources) throws IOException {
42+
Files.writeString(projectRoot.resolve("version.txt"), "2026.05.26.01\n");
43+
Files.writeString(resources.resolve("version.txt"), "2026.04.26.01\n");
44+
var version = Packer.readVersion(projectRoot, Optional.of(resources));
45+
assertThat(version).contains("2026.05.26.01");
46+
}
47+
48+
@Test
49+
void readVersionFromProjectRootWhenNoResources(@TempDir Path projectRoot) throws IOException {
50+
Files.writeString(projectRoot.resolve("version.txt"), "2026.05.26.01\n");
51+
var version = Packer.readVersion(projectRoot, Optional.empty());
52+
assertThat(version).contains("2026.05.26.01");
53+
}
54+
55+
@Test
56+
void readVersionWhenAbsent(@TempDir Path projectRoot, @TempDir Path resources) {
57+
var version = Packer.readVersion(projectRoot, Optional.of(resources));
4358
assertThat(version).isEmpty();
4459
}
4560

0 commit comments

Comments
 (0)