diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index 944b4a9..ea666f4 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -4,44 +4,36 @@ on: [ push, pull_request, workflow_dispatch ] jobs: build-bld-project: + runs-on: ubuntu-latest + strategy: matrix: - java-version: [ 17, 21, 24 ] - kotlin-version: [ 1.9.25, 2.0.21, 2.1.20 ] - os: [ ubuntu-latest, windows-latest, macos-latest ] - - runs-on: ${{ matrix.os }} + java-version: [ 17, 20 ] steps: - name: Checkout source repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 with: fetch-depth: 0 - name: Set up JDK ${{ matrix.java-version }} - uses: actions/setup-java@v4 + uses: actions/setup-java@v3 with: - distribution: "zulu" + distribution: 'zulu' java-version: ${{ matrix.java-version }} - - name: Download dependencies [examples] - working-directory: examples + - name: Grant execute permission for bld + run: chmod +x bld + + - name: Download the dependencies run: ./bld download - - name: Run tests [examples] - working-directory: examples + - name: Download the examples dependencies + run: | + cd examples + chmod +x bld + ./bld download + cd .. + + - name: Run tests with bld run: ./bld compile test - - - name: Compile and create the JAR [examples] - working-directory: examples - run: ./bld compile bootjar - - - name: Compile and create the WAR [examples] - working-directory: examples - run: ./bld compile bootwar - - - name: Download dependencies - run: ./bld download - - - name: Run tests - run: ./bld compile test \ No newline at end of file diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index e864e62..2120d4c 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -3,7 +3,7 @@ name: javadocs-pages on: # Runs on pushes targeting the default branch push: - branches: [ "main" ] + branches: ["main"] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -30,14 +30,14 @@ jobs: steps: - name: Checkout source repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 with: fetch-depth: 0 - name: Set up JDK 17 - uses: actions/setup-java@v4 + uses: actions/setup-java@v3 with: - distribution: "zulu" + distribution: 'zulu' java-version: 17 - name: Build Javadocs @@ -47,11 +47,11 @@ jobs: uses: actions/configure-pages@v3 - name: Upload artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v1 with: # Upload generated Javadocs repository - path: "build/javadoc/" + path: 'build/javadoc/' - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v1 \ No newline at end of file diff --git a/.idea/bld.xml b/.idea/bld.xml deleted file mode 100644 index 6600cee..0000000 --- a/.idea/bld.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/copyright/Apache_License.xml b/.idea/copyright/Apache_License.xml index 4446c15..ade80da 100644 --- a/.idea/copyright/Apache_License.xml +++ b/.idea/copyright/Apache_License.xml @@ -1,6 +1,6 @@ - - \ No newline at end of file + diff --git a/.idea/icon.svg b/.idea/icon.svg deleted file mode 100644 index 81220b4..0000000 --- a/.idea/icon.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml index 074c2f6..254aa33 100644 --- a/.idea/libraries/bld.xml +++ b/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/.idea/libraries/compile.xml b/.idea/libraries/compile.xml index 99cc0c0..9bd86aa 100644 --- a/.idea/libraries/compile.xml +++ b/.idea/libraries/compile.xml @@ -7,7 +7,7 @@ - - + + \ No newline at end of file diff --git a/.idea/libraries/runtime.xml b/.idea/libraries/runtime.xml index d4069f2..2ae5c4b 100644 --- a/.idea/libraries/runtime.xml +++ b/.idea/libraries/runtime.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/.idea/libraries/test.xml b/.idea/libraries/test.xml index 57ed5ef..b80486a 100644 --- a/.idea/libraries/test.xml +++ b/.idea/libraries/test.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 2d63b46..a941588 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,14 +5,7 @@ "type": "java", "name": "Run Tests", "request": "launch", - "mainClass": "org.junit.platform.console.ConsoleLauncher", - "args": [ - "--details=verbose", - "--scan-classpath", - "--disable-banner", - "--disable-ansi-colors", - "--exclude-engine=junit-platform-suite", - "--exclude-engine=junit-vintage"] + "mainClass": "rife.bld.extension.BootJarOperationTest" } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index ba429d0..5633e79 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,13 +3,13 @@ "src/main/java", "src/main/resources", "src/test/java", - "src/test/resources", - "src/bld/java", - "src/bld/resources" + "src/bld/java" ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-2.2.1.jar", - "lib/**/*.jar" + "${HOME}/.bld/dist/bld-1.8.0.jar", + "lib/compile/*.jar", + "lib/runtime/*.jar", + "lib/test/*.jar" ] } diff --git a/README.md b/README.md index bc1a229..0c12f6e 100644 --- a/README.md +++ b/README.md @@ -2,26 +2,18 @@ [![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) -[![bld](https://img.shields.io/badge/2.2.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) +[![bld](https://img.shields.io/badge/1.8.0-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) [![Release](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/releases/com/uwyn/rife2/bld-spring-boot/maven-metadata.xml?color=blue)](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-spring-boot) [![Snapshot](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/snapshots/com/uwyn/rife2/bld-spring-boot/maven-metadata.xml?label=snapshot)](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-spring-boot) [![GitHub CI](https://github.com/rife2/bld-spring-boot/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-spring-boot/actions/workflows/bld.yml) -To install the latest version, add the following to the `lib/bld/bld-wrapper.properties` file: - -```properties -bld.extension-spring-boot=com.uwyn.rife2:bld-spring-boot -``` - -For more information, please refer to the [extensions](https://github.com/rife2/bld/wiki/Extensions) documentation. - -## Create an Executable JAR +To install, please refer to the [extensions documentation](https://github.com/rife2/bld/wiki/Extensions). To create a [Spring Boot executable Java Archive](https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html) (JAR) from the current project: ```java -@BuildCommand(summary = "Creates an executable JAR for the project") +@@BuildCommand(summary = "Creates an executable JAR for the project") public void bootjar() throws Exception { new BootJarOperation() .fromProject(this) @@ -35,8 +27,6 @@ public void bootjar() throws Exception { - [View Examples Project](https://github.com/rife2/bld-spring-boot/tree/main/examples) -## Create an Executable WAR - To create a [Spring Boot executable Web Archive](https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#appendix.executable-jar.nested-jars.war-structure) (WAR) from the current project: @@ -55,13 +45,11 @@ public void bootwar() throws Exception { - [View Examples Project](https://github.com/rife2/bld-spring-boot/tree/main/examples) -## Required Dependency - Don't forget to include the _Spring Boot Loader_ dependency to your project: ```java scope(standalone) - .include(dependency("org.springframework.boot:spring-boot-loader:3.4.4")); + .include(dependency("org.springframeworkboot:spring-boot-loader:3.2.2")); ``` Please check the [BootJarOperation documentation](https://rife2.github.io/bld-spring-boot/rife/bld/extension/BootJarOperation.html#method-summary) diff --git a/config/pmd.xml b/config/pmd.xml index 991e16e..cb0b643 100644 --- a/config/pmd.xml +++ b/config/pmd.xml @@ -7,9 +7,9 @@ + + - - @@ -19,13 +19,12 @@ - - + @@ -36,9 +35,8 @@ - - + @@ -54,6 +52,8 @@ + + @@ -107,4 +107,4 @@ - + \ No newline at end of file diff --git a/examples/.idea/bld.xml b/examples/.idea/bld.xml deleted file mode 100644 index 6600cee..0000000 --- a/examples/.idea/bld.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/examples/.idea/libraries/bld.xml b/examples/.idea/libraries/bld.xml index a203de8..4bb3867 100644 --- a/examples/.idea/libraries/bld.xml +++ b/examples/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/examples/.idea/libraries/compile.xml b/examples/.idea/libraries/compile.xml index 99cc0c0..9bd86aa 100644 --- a/examples/.idea/libraries/compile.xml +++ b/examples/.idea/libraries/compile.xml @@ -7,7 +7,7 @@ - - + + \ No newline at end of file diff --git a/examples/.idea/libraries/runtime.xml b/examples/.idea/libraries/runtime.xml index d4069f2..2ae5c4b 100644 --- a/examples/.idea/libraries/runtime.xml +++ b/examples/.idea/libraries/runtime.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/examples/.idea/libraries/test.xml b/examples/.idea/libraries/test.xml index 57ed5ef..b80486a 100644 --- a/examples/.idea/libraries/test.xml +++ b/examples/.idea/libraries/test.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/examples/.vscode/launch.json b/examples/.vscode/launch.json index 2d63b46..21e1794 100644 --- a/examples/.vscode/launch.json +++ b/examples/.vscode/launch.json @@ -5,14 +5,7 @@ "type": "java", "name": "Run Tests", "request": "launch", - "mainClass": "org.junit.platform.console.ConsoleLauncher", - "args": [ - "--details=verbose", - "--scan-classpath", - "--disable-banner", - "--disable-ansi-colors", - "--exclude-engine=junit-platform-suite", - "--exclude-engine=junit-vintage"] + "mainClass": "com.example.demo.DemoApplicationTest" } ] } diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index ce89108..5633e79 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -3,14 +3,13 @@ "src/main/java", "src/main/resources", "src/test/java", - "src/test/resources", - "src/bld/java", - "src/bld/resources" + "src/bld/java" ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-2.2.1.jar", - "lib/**/*.jar" - ], - "java.compile.nullAnalysis.mode": "automatic" + "${HOME}/.bld/dist/bld-1.8.0.jar", + "lib/compile/*.jar", + "lib/runtime/*.jar", + "lib/test/*.jar" + ] } diff --git a/examples/lib/bld/bld-wrapper.jar b/examples/lib/bld/bld-wrapper.jar index 309bffc..cc3d9e7 100644 Binary files a/examples/lib/bld/bld-wrapper.jar and b/examples/lib/bld/bld-wrapper.jar differ diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index b6ff2db..a446361 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true -bld.downloadLocation= -bld.extension-boot=com.uwyn.rife2:bld-spring-boot:1.0.3 +bld.extensions=com.uwyn.rife2:bld-spring-boot:0.9.0 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES +bld.downloadLocation= bld.sourceDirectories= -bld.version=2.2.1 +bld.version=1.8.0 diff --git a/examples/src/bld/java/com/example/demo/DemoApplicationBuild.java b/examples/src/bld/java/com/example/demo/DemoApplicationBuild.java index e9c9276..bc65eef 100644 --- a/examples/src/bld/java/com/example/demo/DemoApplicationBuild.java +++ b/examples/src/bld/java/com/example/demo/DemoApplicationBuild.java @@ -26,21 +26,16 @@ public class DemoApplicationBuild extends WebProject { repositories = List.of(MAVEN_CENTRAL); - var boot = version(3, 4, 5); scope(compile) - .include(dependency("org.springframework.boot", "spring-boot-starter", boot)) - .include(dependency("org.springframework.boot", "spring-boot-starter-actuator", boot)) - .include(dependency("org.springframework.boot", "spring-boot-starter-web", boot)) - .include(dependency("org.mockito:mockito-core:5.17.0")); + .include(dependency("org.springframework.boot:spring-boot-starter:3.2.2")) + .include(dependency("org.springframework.boot:spring-boot-starter-actuator:3.2.2")) + .include(dependency("org.springframework.boot:spring-boot-starter-web:3.2.2")); scope(test) - .include(dependency("org.springframework.boot", "spring-boot-starter-test", boot)) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 2))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 2))); + .include(dependency("org.springframework.boot:spring-boot-starter-test:3.2.2")) + .include(dependency("org.junit.jupiter:junit-jupiter:5.10.1")) + .include(dependency("org.junit.platform:junit-platform-console-standalone:1.10.1")); scope(standalone) - .include(dependency("org.springframework.boot", "spring-boot-loader", boot)); - - testOperation().javaOptions(List.of("-XX:+EnableDynamicAgentLoading")) - .javaOptions().enableNativeAccess("ALL-UNNAMED"); + .include(dependency("org.springframework.boot:spring-boot-loader:3.2.2")); } public static void main(String[] args) { @@ -68,4 +63,4 @@ public class DemoApplicationBuild extends WebProject { .fromProject(this) .execute(); } -} +} \ No newline at end of file diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar index 4a27297..cc3d9e7 100644 Binary files a/lib/bld/bld-wrapper.jar and b/lib/bld/bld-wrapper.jar differ diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 8d8e3e4..6e1a89e 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true +bld.extension-pmd=com.uwyn.rife2:bld-pmd:0.9.5 +bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_RELEASES bld.downloadLocation= -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.2.2 -bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_RELEASES bld.sourceDirectories= -bld.version=2.2.1 +bld.version=1.8.0 diff --git a/src/bld/java/rife/bld/extension/SpringBootBuild.java b/src/bld/java/rife/bld/extension/SpringBootBuild.java index d243d97..9922002 100644 --- a/src/bld/java/rife/bld/extension/SpringBootBuild.java +++ b/src/bld/java/rife/bld/extension/SpringBootBuild.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,21 +33,20 @@ public class SpringBootBuild extends Project { public SpringBootBuild() { pkg = "rife.bld.extension"; name = "bld-spring-boot"; - version = version(1, 0, 4, "SNAPSHOT"); + version = version(0, 9, 0); javaRelease = 17; - downloadSources = true; autoDownloadPurge = true; repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS); scope(compile) - .include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1))); + .include(dependency("com.uwyn.rife2", "bld", version(1, 8, 0, "SNAPSHOT"))); scope(test) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 2))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 2))) - .include(dependency("org.assertj", "assertj-core", version(3, 27, 3))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 1))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 1))) + .include(dependency("org.assertj", "assertj-core", version(3, 25, 2))); javadocOperation() .javadocOptions() @@ -57,26 +56,28 @@ public class SpringBootBuild extends Project { publishOperation() .repository(version.isSnapshot() ? repository("rife2-snapshot") : repository("rife2")) - .repository(repository("github")) .info() .groupId("com.uwyn.rife2") .artifactId("bld-spring-boot") .description("bld Extension for Spring Boot") .url("https://github.com/rife2/bld-spring-boot") - .developer(new PublishDeveloper() - .id("ethauvin") - .name("Erik C. Thauvin") - .email("erik@thauvin.net") - .url("https://erik.thauvin.net/") + .developer( + new PublishDeveloper() + .id("ethauvin") + .name("Erik C. Thauvin") + .email("erik@thauvin.net") + .url("https://erik.thauvin.net/") ) - .license(new PublishLicense() - .name("The Apache License, Version 2.0") - .url("https://www.apache.org/licenses/LICENSE-2.0.txt") + .license( + new PublishLicense() + .name("The Apache License, Version 2.0") + .url("http://www.apache.org/licenses/LICENSE-2.0.txt") ) - .scm(new PublishScm() - .connection("scm:git:https://github.com/rife2/bld-spring-boot.git") - .developerConnection("scm:git:git@github.com:rife2/bld-spring-boot.git") - .url("https://github.com/rife2/bld-spring-boot") + .scm( + new PublishScm() + .connection("scm:git:https://github.com/rife2/bld-spring-boot.git") + .developerConnection("scm:git:git@github.com:rife2/bld-spring-boot.git") + .url("https://github.com/rife2/bld-spring-boot") ) .signKey(property("sign.key")) .signPassphrase(property("sign.passphrase")); @@ -87,7 +88,7 @@ public class SpringBootBuild extends Project { } @BuildCommand(summary = "Runs PMD analysis") - public void pmd() throws Exception { + public void pmd() { new PmdOperation() .fromProject(this) .failOnViolation(true) diff --git a/src/main/java/rife/bld/extension/AbstractBootOperation.java b/src/main/java/rife/bld/extension/AbstractBootOperation.java index 753a445..4709c5f 100644 --- a/src/main/java/rife/bld/extension/AbstractBootOperation.java +++ b/src/main/java/rife/bld/extension/AbstractBootOperation.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ package rife.bld.extension; import rife.bld.Project; import rife.bld.operations.AbstractOperation; -import rife.bld.operations.exceptions.ExitStatusException; import rife.tools.FileUtils; import rife.tools.exceptions.FileUtilsErrorException; @@ -27,13 +26,10 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.nio.file.Files; -import java.nio.file.Path; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; import java.util.spi.ToolProvider; @@ -49,10 +45,10 @@ import java.util.spi.ToolProvider; public abstract class AbstractBootOperation> extends AbstractOperation> { private static final Logger LOGGER = Logger.getLogger(AbstractBootOperation.class.getName()); - private final Collection infLibs_ = new ArrayList<>(); - private final Collection launcherLibs_ = new ArrayList<>(); - private final Map manifestAttributes_ = new ConcurrentHashMap<>(); - private final Collection sourceDirectories_ = new ArrayList<>(); + private final List infLibs_ = new ArrayList<>(); + private final List launcherLibs_ = new ArrayList<>(); + private final List manifestAttributes_ = new ArrayList<>(); + private final List sourceDirectories_ = new ArrayList<>(); private File destinationDirectory_; private String destinationFileName_; private String launcherClass_; @@ -92,17 +88,6 @@ public abstract class AbstractBootOperation> return destinationDirectory(new File(directory)); } - /** - * Provides the destination directory in which the archive will be created. - * - * @param directory the destination directory - * @return this operation instance - * @throws IOException if an error occurs - */ - public T destinationDirectory(Path directory) throws IOException { - return destinationDirectory(directory.toFile()); - } - /** * Provides the file name that will be used for the archive creation. * @@ -131,12 +116,9 @@ public abstract class AbstractBootOperation> * @param stagingDirectory the staging directory * @throws FileUtilsErrorException if an error occurs */ - protected void executeCopyBootLoader(File stagingDirectory) throws FileUtilsErrorException, ExitStatusException { + protected void executeCopyBootLoader(File stagingDirectory) throws FileUtilsErrorException { if (launcherLibs_.isEmpty()) { - if (LOGGER.isLoggable(Level.SEVERE) && !silent()) { - LOGGER.severe("Spring Boot loader launcher required."); - } - throw new ExitStatusException(ExitStatusException.EXIT_FAILURE); + throw new IllegalArgumentException("Spring Boot loader launcher required."); } else { var meta_inf_dir = new File(stagingDirectory, "META-INF"); for (var jar : launcherLibs()) { @@ -145,7 +127,7 @@ public abstract class AbstractBootOperation> if (meta_inf_dir.exists()) { FileUtils.deleteDirectory(meta_inf_dir); } - } else if (LOGGER.isLoggable(Level.WARNING) && !silent()) { + } else if (LOGGER.isLoggable(Level.WARNING)) { LOGGER.warning("File not found: " + jar.getAbsolutePath()); } } @@ -162,13 +144,15 @@ public abstract class AbstractBootOperation> var inf_classes_dir = new File(stagingInfDirectory, "classes"); BootUtils.mkDirs(inf_classes_dir); - for (var dir : sourceDirectories_) { + for (var dir : sourceDirectories()) { if (dir.exists()) { FileUtils.copyDirectory(dir, inf_classes_dir); - } else if (LOGGER.isLoggable(Level.WARNING) && !silent()) { + } else if (LOGGER.isLoggable(Level.WARNING)) { LOGGER.warning("Directory not found: " + dir.getAbsolutePath()); } } + + BootUtils.deleteDirectories(new File(inf_classes_dir, "resources"), new File(inf_classes_dir, "templates")); } /** @@ -184,7 +168,7 @@ public abstract class AbstractBootOperation> for (var jar : infLibs_) { if (jar.exists()) { Files.copy(jar.toPath(), inf_lib_dir.toPath().resolve(jar.getName())); - } else if (LOGGER.isLoggable(Level.WARNING) && !silent()) { + } else if (LOGGER.isLoggable(Level.WARNING)) { LOGGER.warning("File not found: " + jar.getAbsolutePath()); } } @@ -219,7 +203,7 @@ public abstract class AbstractBootOperation> var jarTool = ToolProvider.findFirst("jar").orElseThrow(); String args; - if (LOGGER.isLoggable(Level.FINER) && !silent()) { + if (LOGGER.isLoggable(Level.FINER)) { args = "-0cMvf"; } else { args = "-0cMf"; @@ -255,8 +239,8 @@ public abstract class AbstractBootOperation> var manifest = new File(meta_inf_dir, "MANIFEST.MF").toPath(); try (var fileWriter = Files.newBufferedWriter(manifest)) { - for (var set : manifestAttributes_.entrySet()) { - fileWriter.write(set.getKey() + ": " + set.getValue() + System.lineSeparator()); + for (var manifestAttribute : manifestAttributes()) { + fileWriter.write(manifestAttribute.name() + ": " + manifestAttribute.value() + System.lineSeparator()); } } } @@ -275,7 +259,6 @@ public abstract class AbstractBootOperation> * * @param jars a collection of Java archive files * @return this operation instance - * @see #infLibs(File...) */ public T infLibs(Collection jars) { infLibs_.addAll(jars); @@ -288,65 +271,22 @@ public abstract class AbstractBootOperation> * * @param jars one or more Java archive files * @return this operation instance - * @see #infLibs(Collection) */ public T infLibs(File... jars) { - return infLibs(List.of(jars)); - } - - /** - * Provides the libraries that will be stored in {@code BOOT-INF} or {@code WEB-INF}. - * - * @param jars one or more Java archive files - * @return this operation instance - * @see #infLibsPaths(Collection) - */ - public T infLibs(Path... jars) { - return infLibsPaths(List.of(jars)); - } - - /** - * Provides the libraries that will be stored in {@code BOOT-INF} or {@code WEB-INF}. - * - * @param jars one or more Java archive files - * @return this operation instance - * @see #infLibsStrings(Collection) - */ - public T infLibs(String... jars) { - return infLibsStrings(List.of(jars)); + infLibs_.addAll(List.of(jars)); + //noinspection unchecked + return (T) this; } /** * Retrieves the libraries in {@code BOOT-INF} or {@code WEB-INF}. * - * @return the Java archives + * @return a list of Java archives */ - public Collection infLibs() { + public List infLibs() { return infLibs_; } - /** - * Provides the libraries that will be stored in {@code BOOT-INF} or {@code WEB-INF}. - * - * @param jars one or more Java archive files - * @return this operation instance - * @see #infLibs(Path...) - */ - public T infLibsPaths(Collection jars) { - return infLibs(jars.stream().map(Path::toFile).toList()); - } - - /** - * Provides the libraries that will be stored in {@code BOOT-INF} or {@code WEB-INF}. - * - * @param jars one or more Java archive files - * @return this operation instance - * @see #infLibs(String...) - */ - public T infLibsStrings(Collection jars) { - return infLibs(jars.stream().map(File::new).toList()); - } - /** * Provides the Spring Boot loader launcher fully-qualified class name. *

@@ -381,9 +321,9 @@ public abstract class AbstractBootOperation> /** * Retrieves the Spring Boot loader launcher libraries. * - * @return the Java archives + * @return a list of Java archives */ - public Collection launcherLibs() { + public List launcherLibs() { return launcherLibs_; } @@ -392,81 +332,22 @@ public abstract class AbstractBootOperation> * * @param jars a collection of Java archives * @return this operation instance - * @throws IOException if a JAR could not be found - * @see #infLibs(File...) + * @throws IOException if an error occurs */ public T launcherLibs(Collection jars) throws IOException { - for (var j : jars) { - if (j.exists()) { - launcherLibs_.add(j); - } else { - throw new IOException("Spring Boot loader launcher library not found: " + j); + if (!jars.isEmpty()) { + for (var j : jars) { + if (j.exists()) { + launcherLibs_.add(j); + } else { + throw new IOException("Spring Boot loader launcher library not found: " + j); + } } } //noinspection unchecked return (T) this; } - /** - * Provides the libraries for the Spring Boot loader launcher. - * - * @param jars one or more Java archives - * @return this operation instance - * @throws IOException if a JAR could not be found - * @see #infLibs(Collection) - */ - public T launcherLibs(File... jars) throws IOException { - return launcherLibs(List.of(jars)); - } - - /** - * Provides the libraries for the Spring Boot loader launcher. - * - * @param jars one or more Java archives - * @return this operation instance - * @throws IOException if a JAR could not be found - * @see #launcherLibsStrings(Collection) - */ - public T launcherLibs(String... jars) throws IOException { - return launcherLibsStrings(List.of(jars)); - } - - /** - * Provides the libraries for the Spring Boot loader launcher. - * - * @param jars one or more Java archives - * @return this operation instance - * @throws IOException if a JAR could not be found - * @see #launcherLibsPaths(Collection) - */ - public T launcherLibs(Path... jars) throws IOException { - return launcherLibsPaths(List.of(jars)); - } - - /** - * Provides the libraries for the Spring Boot loader launcher. - * - * @param jars one or more Java archives - * @return this operation instance - * @throws IOException if a JAR could not be found - * @see #launcherLibs(Path...) - */ - public T launcherLibsPaths(Collection jars) throws IOException { - return launcherLibs(jars.stream().map(Path::toFile).toList()); - } - - /** - * Provides the libraries for the Spring Boot loader launcher. - * - * @param jars one or more Java archives - * @return this operation instance - * @throws IOException if a JAR could not be found - * @see #launcherLibs(String...) - */ - public T launcherLibsStrings(Collection jars) throws IOException { - return launcherLibs(jars.stream().map(File::new).toList()); - } - /** * Provides the fully-qualified main class name. * @@ -496,17 +377,17 @@ public abstract class AbstractBootOperation> * @return this operation instance */ public T manifestAttribute(String name, String value) { - manifestAttributes_.put(name, value); + manifestAttributes_.add(new BootManifestAttribute(name, value)); //noinspection unchecked return (T) this; } /** - * Retrieves the attributes that will be put in the archive manifest. + * Retrieves the list of attributes that will be put in the archive manifest. * - * @return the manifest attributes + * @return a list of manifest attributes */ - public Map manifestAttributes() { + public List manifestAttributes() { return manifestAttributes_; } @@ -515,10 +396,9 @@ public abstract class AbstractBootOperation> * * @param attributes the manifest attributes * @return this operation instance - * @see #manifestAttribute(String, String) */ - public T manifestAttributes(Map attributes) { - manifestAttributes_.putAll(attributes); + public T manifestAttributes(Collection attributes) { + manifestAttributes_.addAll(attributes); //noinspection unchecked return (T) this; } @@ -528,78 +408,22 @@ public abstract class AbstractBootOperation> * * @param directories one or more source directories * @return this operation instance - * @see #sourceDirectories(File...) - */ - public T sourceDirectories(Collection directories) { - sourceDirectories_.addAll(directories); - //noinspection unchecked - return (T) this; - } - - /** - * Provides source directories that will be used for the archive creation. - * - * @param directories one or more source directories - * @return this operation instance - * @see #sourceDirectories(Collection) */ public T sourceDirectories(File... directories) { - return sourceDirectories(List.of(directories)); - } - - /** - * Provides source directories that will be used for the archive creation. - * - * @param directories one or more source directories - * @return this operation instance - * @see #sourceDirectoriesStrings(Collection) - */ - public T sourceDirectories(String... directories) { - return sourceDirectoriesStrings(List.of(directories)); - } - - /** - * Provides source directories that will be used for the archive creation. - * - * @param directories one or more source directories - * @return this operation instance - * @see #sourceDirectoriesPaths(Collection) - */ - public T sourceDirectories(Path... directories) { - return sourceDirectoriesPaths(List.of(directories)); + sourceDirectories_.addAll(List.of(directories)); + //noinspection unchecked + return (T) this; } /** * Retrieves the source directories that will be used for the archive creation. * - * @return the source directories + * @return a list of directories */ - public Collection sourceDirectories() { + public List sourceDirectories() { return sourceDirectories_; } - /** - * Provides source directories that will be used for the archive creation. - * - * @param directories one or more source directories - * @return this operation instance - * @see #sourceDirectories(Path...) - */ - public T sourceDirectoriesPaths(Collection directories) { - return sourceDirectories(directories.stream().map(Path::toFile).toList()); - } - - /** - * Provides source directories that will be used for the archive creation. - * - * @param directories one or more source directories - * @return this operation instance - * @see #sourceDirectories(String...) - */ - public T sourceDirectoriesStrings(Collection directories) { - return sourceDirectories(directories.stream().map(File::new).toList()); - } - /** * Verifies that all the elements ({@link #mainClass() mainClass}, {@link #launcherClass() launcherClass} and * {@link #launcherLibs() launcherLibs}) required to create the archive have been provided, throws an diff --git a/src/main/java/rife/bld/extension/BootJarOperation.java b/src/main/java/rife/bld/extension/BootJarOperation.java index d758857..5667bfd 100644 --- a/src/main/java/rife/bld/extension/BootJarOperation.java +++ b/src/main/java/rife/bld/extension/BootJarOperation.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.Collection; -import java.util.Map; +import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -89,7 +89,7 @@ public class BootJarOperation extends AbstractBootOperation { * {@link Project#standaloneClasspathJars() standaloneClasspathJars} *

  • The {@link #mainClass(String) main class} to {@link Project#mainClass() mainClass}
  • *
  • The {@code Manifest-Version}, {@code Main-Class} and {@code Start-Class} - * {@link #manifestAttributes() manifest attributes}
  • + * {@link #manifestAttributes(Collection) manifest attributes} *
  • The {@link #sourceDirectories(File...) source directories} to * {@link Project#buildMainDirectory() buildMainDirectory} and * {@link Project#srcMainResourcesDirectory() srcMainResourcesDirectory}
  • @@ -107,10 +107,11 @@ public class BootJarOperation extends AbstractBootOperation { .launcherClass(BootUtils.launcherClass(project, "JarLauncher")) .launcherLibs(project.standaloneClasspathJars()) .mainClass(project.mainClass()) - .manifestAttributes(Map.of( - "Manifest-Version", "1.0", - "Main-Class", launcherClass(), - "Start-Class", mainClass())) + .manifestAttributes(List.of( + new BootManifestAttribute("Manifest-Version", "1.0"), + new BootManifestAttribute("Main-Class", launcherClass()), + new BootManifestAttribute("Start-Class", mainClass()) + )) .sourceDirectories(project.buildMainDirectory(), project.srcMainResourcesDirectory()); } } diff --git a/src/main/java/rife/bld/extension/BootManifestAttribute.java b/src/main/java/rife/bld/extension/BootManifestAttribute.java new file mode 100644 index 0000000..beac96d --- /dev/null +++ b/src/main/java/rife/bld/extension/BootManifestAttribute.java @@ -0,0 +1,28 @@ +/* + * Copyright 2023-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package rife.bld.extension; + +/** + * Constructs a new manifest attribute. + * + * @param name The attribute name + * @param value The attribute value + * @author Erik C. Thauvin + * @since 1.0 + */ +public record BootManifestAttribute(String name, String value) { +} diff --git a/src/main/java/rife/bld/extension/BootUtils.java b/src/main/java/rife/bld/extension/BootUtils.java index 42ae132..dfdfee9 100644 --- a/src/main/java/rife/bld/extension/BootUtils.java +++ b/src/main/java/rife/bld/extension/BootUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ package rife.bld.extension; import rife.bld.Project; +import rife.tools.FileUtils; +import rife.tools.exceptions.FileUtilsErrorException; import java.io.File; import java.io.IOException; @@ -36,6 +38,20 @@ public final class BootUtils { // no-op } + /** + * Deletes the given directories. + * + * @param directories one or more directories to delete + * @throws FileUtilsErrorException if an error occurs + */ + public static void deleteDirectories(File... directories) throws FileUtilsErrorException { + for (var d : directories) { + if (d.exists()) { + FileUtils.deleteDirectory(d); + } + } + } + /** * Calculates the given file size in bytes, kilobytes, megabytes, gigabytes or terabytes. * diff --git a/src/main/java/rife/bld/extension/BootWarOperation.java b/src/main/java/rife/bld/extension/BootWarOperation.java index 51f7fdf..7ee8db7 100644 --- a/src/main/java/rife/bld/extension/BootWarOperation.java +++ b/src/main/java/rife/bld/extension/BootWarOperation.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,11 +22,9 @@ import rife.tools.FileUtils; import java.io.File; import java.io.IOException; import java.nio.file.Files; -import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; @@ -114,7 +112,7 @@ public class BootWarOperation extends AbstractBootOperation { * {@link Project#standaloneClasspathJars() standaloneClasspathJars} *
  • The {@link #mainClass(String) main class} to {@link Project#mainClass() mainClass}
  • *
  • The {@code Manifest-Version}, {@code Main-Class} and {@code Start-Class} - * {@link #manifestAttributes() manifest attributes}
  • + * {@link #manifestAttributes(Collection) manifest attributes} *
  • The {@link #sourceDirectories(File...) source directories} to * {@link Project#buildMainDirectory() buildMainDirectory} and * {@link Project#srcMainResourcesDirectory() srcMainResourcesDirectory}
  • @@ -133,20 +131,19 @@ public class BootWarOperation extends AbstractBootOperation { .launcherClass(BootUtils.launcherClass(project, "WarLauncher")) .launcherLibs(project.standaloneClasspathJars()) .mainClass(project.mainClass()) - .manifestAttributes(Map.of( - "Manifest-Version", "1.0", - "Main-Class", launcherClass(), - "Start-Class", mainClass())) + .manifestAttributes(List.of( + new BootManifestAttribute("Manifest-Version", "1.0"), + new BootManifestAttribute("Main-Class", launcherClass()), + new BootManifestAttribute("Start-Class", mainClass()) + )) .providedLibs(project.providedClasspathJars()) .sourceDirectories(project.buildMainDirectory(), project.srcMainResourcesDirectory()); } - /** * Provides libraries that will be used for the WAR creation in {@code /WEB-INF/lib-provided}. * * @param jars a collection of Java archive files * @return this operation instance - * @see #providedLibs(File...) */ public BootWarOperation providedLibs(Collection jars) { providedLibs_.addAll(jars); @@ -158,62 +155,9 @@ public class BootWarOperation extends AbstractBootOperation { * * @param jars one or more Java archive files * @return this operation instance - * @see #providedLibsStrings(Collection) - */ - public BootWarOperation providedLibs(String... jars) { - return providedLibsStrings(List.of(jars)); - } - - /** - * Provides the libraries that will be used for the WAR creation in {@code /WEB-INF/lib-provided}. - * - * @param jars one or more Java archive files - * @return this operation instance - * @see #providedLibs(Collection) */ public BootWarOperation providedLibs(File... jars) { - return providedLibs(List.of(jars)); - } - - /** - * Provides the libraries that will be used for the WAR creation in {@code /WEB-INF/lib-provided}. - * - * @param jars one or more Java archive files - * @return this operation instance - * @see #providedLibsPaths(Collection) - */ - public BootWarOperation providedLibs(Path... jars) { - return providedLibsPaths(List.of(jars)); - } - - /** - * Retrieves the libraries that will be used for the WAR creation in {@code /WEB-INF/lib-provided}. - * - * @return the list of Java archive files. - */ - public List providedLibs() { - return providedLibs_; - } - - /** - * Provides the libraries that will be used for the WAR creation in {@code /WEB-INF/lib-provided}. - * - * @param jars one or more Java archive files - * @return this operation instance - * @see #providedLibs(Path...) - */ - public BootWarOperation providedLibsPaths(Collection jars) { - return providedLibs(jars.stream().map(Path::toFile).toList()); - } - - /** - * Provides the libraries that will be used for the WAR creation in {@code /WEB-INF/lib-provided}. - * - * @param jars one or more Java archive files - * @return this operation instance - * @see #providedLibs(String...) - */ - public BootWarOperation providedLibsStrings(Collection jars) { - return providedLibs(jars.stream().map(File::new).toList()); + providedLibs_.addAll(List.of(jars)); + return this; } } diff --git a/src/test/java/rife/bld/extension/BootJarOperationTest.java b/src/test/java/rife/bld/extension/BootJarOperationTest.java index 5ee7341..9515e7d 100644 --- a/src/test/java/rife/bld/extension/BootJarOperationTest.java +++ b/src/test/java/rife/bld/extension/BootJarOperationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package rife.bld.extension; -import org.assertj.core.api.AutoCloseableSoftAssertions; import org.junit.jupiter.api.Test; import rife.bld.Project; import rife.bld.dependencies.VersionNumber; @@ -35,8 +34,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; class BootJarOperationTest { - private static final String BLD = "bld-2.2.1.jar"; - private static final String BOOT_VERSION = "3.4.5"; + private static final String BLD = "bld-1.8.0-20240107.042858-1.jar"; private static final String EXAMPLES_LIB_COMPILE = "examples/lib/compile/"; private static final String EXAMPLES_LIB_RUNTIME = "examples/lib/runtime/"; private static final String EXAMPLES_LIB_STANDALONE = "examples/lib/standalone/"; @@ -46,8 +44,6 @@ class BootJarOperationTest { org/springframework/boot/ org/springframework/boot/loader/ org/springframework/boot/loader/jar/ - org/springframework/boot/loader/jar/JarEntriesStream$InputStreamSupplier.class - org/springframework/boot/loader/jar/JarEntriesStream.class org/springframework/boot/loader/jar/ManifestInfo.class org/springframework/boot/loader/jar/MetaInfVersionsInfo.class org/springframework/boot/loader/jar/NestedJarFile$JarEntriesEnumeration.class @@ -62,7 +58,6 @@ class BootJarOperationTest { org/springframework/boot/loader/jar/ZipInflaterInputStream.class org/springframework/boot/loader/jarmode/ org/springframework/boot/loader/jarmode/JarMode.class - org/springframework/boot/loader/jarmode/JarModeErrorException.class org/springframework/boot/loader/launch/ org/springframework/boot/loader/launch/Archive$Entry.class org/springframework/boot/loader/launch/Archive.class @@ -125,7 +120,6 @@ class BootJarOperationTest { org/springframework/boot/loader/nio/file/NestedFileSystem.class org/springframework/boot/loader/nio/file/NestedFileSystemProvider.class org/springframework/boot/loader/nio/file/NestedPath.class - org/springframework/boot/loader/nio/file/UriPathEncoder.class org/springframework/boot/loader/ref/ org/springframework/boot/loader/ref/Cleaner.class org/springframework/boot/loader/ref/DefaultCleaner.class @@ -134,10 +128,9 @@ class BootJarOperationTest { org/springframework/boot/loader/zip/CloseableDataBlock.class org/springframework/boot/loader/zip/DataBlock.class org/springframework/boot/loader/zip/DataBlockInputStream.class - org/springframework/boot/loader/zip/FileDataBlock$FileAccess.class - org/springframework/boot/loader/zip/FileDataBlock$Tracker$1.class - org/springframework/boot/loader/zip/FileDataBlock$Tracker.class - org/springframework/boot/loader/zip/FileDataBlock.class + org/springframework/boot/loader/zip/FileChannelDataBlock$ManagedFileChannel.class + org/springframework/boot/loader/zip/FileChannelDataBlock$Tracker.class + org/springframework/boot/loader/zip/FileChannelDataBlock.class org/springframework/boot/loader/zip/NameOffsetLookups.class org/springframework/boot/loader/zip/VirtualDataBlock.class org/springframework/boot/loader/zip/VirtualZipDataBlock$DataPart.class @@ -159,11 +152,9 @@ class BootJarOperationTest { """; private static final String MAIN_CLASS = "com.example.Foo"; private static final String PROVIDED_LIB = "LatencyUtils-2.0.3.jar"; - private static final String SPRING_BOOT = "spring-boot-" + BOOT_VERSION + ".jar"; - private static final String SPRING_BOOT_ACTUATOR = "spring-boot-actuator-" + BOOT_VERSION + ".jar"; - private static final String SPRING_BOOT_LOADER = "spring-boot-loader-" + BOOT_VERSION + ".jar"; - private static final String SRC_MAIN_JAVA = "src/main/java"; - private static final String SRC_TEST_JAVA = "src/test/java"; + private static final String SPRING_BOOT = "spring-boot-3.2.2.jar"; + private static final String SPRING_BOOT_ACTUATOR = "spring-boot-actuator-3.2.2.jar"; + private static final String SPRING_BOOT_LOADER = "spring-boot-loader-3.2.2.jar"; private StringBuilder readJarEntries(File jar) throws IOException { var jarEntries = new StringBuilder(); @@ -186,13 +177,7 @@ class BootJarOperationTest { .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("class required"); - assertThatCode(() -> new BootWarOperation().launcherLibs(new File("foo"))) - .as("foo") - .isInstanceOf(IOException.class) - .hasMessageContaining("not found"); - - assertThatCode(() -> new BootWarOperation().launcherLibs("bar")) - .as("bar") + assertThatCode(() -> new BootWarOperation().launcherLibs(List.of(new File("foo")))) .isInstanceOf(IOException.class) .hasMessageContaining("not found"); @@ -205,38 +190,6 @@ class BootJarOperationTest { assertThat(bootWar.verifyExecute()).isTrue(); } - @Test - void testInfLibs() { - var op = new BootWarOperation(); - - var foo = new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT); - var bar = new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR); - - op.infLibs(EXAMPLES_LIB_COMPILE + SPRING_BOOT, EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR); - assertThat(op.infLibs()).as("String...").containsExactly(foo, bar); - op.infLibs().clear(); - - op.infLibs(foo, bar); - assertThat(op.infLibs()).as("File...").containsExactly(foo, bar); - op.infLibs().clear(); - - op.infLibs(foo.toPath(), bar.toPath()); - assertThat(op.infLibs()).as("Path...").containsExactly(foo, bar); - op.infLibs().clear(); - - op.infLibsStrings(List.of(EXAMPLES_LIB_COMPILE + SPRING_BOOT, EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR)); - assertThat(op.infLibs()).as("List(String...)").containsExactly(foo, bar); - op.infLibs().clear(); - - op.infLibs(List.of(foo, bar)); - assertThat(op.infLibs()).as("List(File...)").containsExactly(foo, bar); - op.infLibs().clear(); - - op.infLibsPaths(List.of(foo.toPath(), bar.toPath())); - assertThat(op.infLibs()).as("List(Path...)").containsExactly(foo, bar); - op.infLibs().clear(); - } - @Test @SuppressWarnings("PMD.AvoidDuplicateLiterals") void testJarExecute() throws Exception { @@ -265,6 +218,7 @@ class BootJarOperationTest { "BOOT-INF/classes/rife/bld/extension/\n" + "BOOT-INF/classes/rife/bld/extension/AbstractBootOperation.class\n" + "BOOT-INF/classes/rife/bld/extension/BootJarOperation.class\n" + + "BOOT-INF/classes/rife/bld/extension/BootManifestAttribute.class\n" + "BOOT-INF/classes/rife/bld/extension/BootUtils.class\n" + "BOOT-INF/classes/rife/bld/extension/BootWarOperation.class\n" + "BOOT-INF/lib/\n" + @@ -282,9 +236,9 @@ class BootJarOperationTest { new BootJarOperation() .fromProject(new CustomProject(new File("."))) .launcherLibs(List.of(new File(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER))) - .destinationDirectory(tmp_dir.getAbsolutePath()) - .infLibs(new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT).getAbsolutePath(), - new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR).getAbsolutePath()) + .destinationDirectory(tmp_dir) + .infLibs(new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT), + new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR)) .execute(); var jarFile = new File(tmp_dir, "test_project-0.0.1-boot.jar"); @@ -299,6 +253,7 @@ class BootJarOperationTest { "BOOT-INF/classes/rife/bld/extension/\n" + "BOOT-INF/classes/rife/bld/extension/AbstractBootOperation.class\n" + "BOOT-INF/classes/rife/bld/extension/BootJarOperation.class\n" + + "BOOT-INF/classes/rife/bld/extension/BootManifestAttribute.class\n" + "BOOT-INF/classes/rife/bld/extension/BootUtils.class\n" + "BOOT-INF/classes/rife/bld/extension/BootWarOperation.class\n" + "BOOT-INF/lib/\n" + @@ -311,95 +266,33 @@ class BootJarOperationTest { FileUtils.deleteDirectory(tmp_dir); } - @Test - void testLauncherLibs() throws IOException { - var op = new BootJarOperation(); - - var launcher = new File(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER); - op = op.launcherLibs(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER); - assertThat(op.launcherLibs()).as("String...").containsExactly(launcher); - op.launcherLibs().clear(); - - op = op.launcherLibs(launcher); - assertThat(op.launcherLibs()).as("File...").containsExactly(launcher); - op.launcherLibs().clear(); - - op = op.launcherLibs(launcher.toPath()); - assertThat(op.launcherLibs()).as("Path...").containsExactly(launcher); - op.launcherLibs().clear(); - - op = op.launcherLibsStrings(List.of(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER)); - assertThat(op.launcherLibs()).as("List(String...)").containsExactly(launcher); - op.launcherLibs().clear(); - - op = op.launcherLibs(List.of(launcher)); - assertThat(op.launcherLibs()).as("List(File...)").containsExactly(launcher); - op.launcherLibs().clear(); - - op = op.launcherLibsPaths(List.of(launcher.toPath())); - assertThat(op.launcherLibs()).as("List(Path...)").containsExactly(launcher); - op.launcherLibs().clear(); - } - @Test void testProject() throws IOException { var tmp_dir = Files.createTempDirectory("bootprjtmp").toFile(); var project = new CustomProject(tmp_dir); - var bootJar = new BootJarOperation().fromProject(project).sourceDirectories(SRC_MAIN_JAVA); + var bootJar = new BootJarOperation().fromProject(project); - try (var softly = new AutoCloseableSoftAssertions()) { - softly.assertThat(bootJar.mainClass()).as("mainClass").isEqualTo(MAIN_CLASS); - softly.assertThat(bootJar.sourceDirectories()).as("sourceDirectories.size").hasSize(3) - .containsExactly(project.buildMainDirectory(), project.srcMainResourcesDirectory(), - new File(SRC_MAIN_JAVA)); - softly.assertThat(bootJar.manifestAttributes()).as("manifestAttributes.size").hasSize(3); - softly.assertThat(bootJar.manifestAttributes().get("Manifest-Version")).as("Manifest-Version") - .isEqualTo("1.0"); - softly.assertThat(bootJar.manifestAttributes().get("Main-Class")).as("Main-Class").endsWith("JarLauncher"); - softly.assertThat(bootJar.manifestAttributes().get("Start-Class")).as("Start-Class").isEqualTo(MAIN_CLASS); - softly.assertThat(bootJar.manifestAttribute("Manifest-Test", "tsst") - .manifestAttributes().get("Manifest-Test")).as("Manifest-Test").isEqualTo("tsst"); - softly.assertThat(bootJar.destinationDirectory()).as("destinationDirectory").isDirectory(); - softly.assertThat(bootJar.destinationDirectory()).isEqualTo(project.buildDistDirectory()); - softly.assertThat(bootJar.infLibs()).as("infoLibs").isEmpty(); - softly.assertThat(bootJar.launcherLibs()).as("launcherJars").isEmpty(); - softly.assertThat(bootJar.destinationFileName()).isEqualTo("test_project-0.0.1-boot.jar"); - } + assertThat(bootJar.mainClass()).as("mainClass").isEqualTo(MAIN_CLASS); + assertThat(bootJar.sourceDirectories()).as("sourceDirectories.size").hasSize(2); + assertThat(bootJar.manifestAttributes()).as("manifestAttributes.size").hasSize(3); + assertThat(bootJar.manifestAttributes().get(0)).as("Manifest-Version") + .isEqualTo(new BootManifestAttribute("Manifest-Version", "1.0")); + assertThat(bootJar.manifestAttributes().get(1).value()).as("Main-Class").endsWith("JarLauncher"); + assertThat(bootJar.manifestAttributes().get(2)).as("Start-Class") + .isEqualTo(new BootManifestAttribute("Start-Class", MAIN_CLASS)); + assertThat(bootJar.manifestAttribute("Manifest-Test", "tsst") + .manifestAttributes()).as("Manifest-Test").hasSize(4) + .element(3).extracting(BootManifestAttribute::name).isEqualTo("Manifest-Test"); + assertThat(bootJar.destinationDirectory()).as("destinationDirectory").isDirectory(); + assertThat(bootJar.destinationDirectory().getAbsolutePath()).as("destinationDirectory") + .isEqualTo(Path.of(tmp_dir.getPath(), "build", "dist").toString()); + assertThat(bootJar.infLibs()).as("infoLibs").isEmpty(); + assertThat(bootJar.launcherLibs()).as("launcherJars").isEmpty(); + assertThat(bootJar.destinationFileName()).isEqualTo("test_project-0.0.1-boot.jar"); FileUtils.deleteDirectory(tmp_dir); } - @Test - void testSourceDirectories() { - var op = new BootJarOperation(); - - var src = new File(SRC_MAIN_JAVA); - var test = new File(SRC_TEST_JAVA); - op = op.sourceDirectories(SRC_MAIN_JAVA, SRC_TEST_JAVA); - assertThat(op.sourceDirectories()).as("String...").containsExactly(src, test); - op.sourceDirectories().clear(); - - op = op.sourceDirectories(src, test); - assertThat(op.sourceDirectories()).as("File...").containsExactly(src, test); - op.sourceDirectories().clear(); - - op = op.sourceDirectories(src.toPath(), test.toPath()); - assertThat(op.sourceDirectories()).as("Path...").containsExactly(src, test); - op.sourceDirectories().clear(); - - op.sourceDirectoriesStrings(List.of(SRC_MAIN_JAVA, SRC_TEST_JAVA)); - assertThat(op.sourceDirectories()).as("List(String...").containsExactly(src, test); - op.sourceDirectories().clear(); - - op.sourceDirectories(List.of(src, test)); - assertThat(op.sourceDirectories()).as("List(File...)").containsExactly(src, test); - op.sourceDirectories().clear(); - - op.sourceDirectoriesPaths(List.of(src.toPath(), test.toPath())); - assertThat(op.sourceDirectories()).as("List(Path...)").containsExactly(src, test); - op.sourceDirectories().clear(); - } - @Test void testWarProjectExecute() throws Exception { var tmp_dir = Files.createTempDirectory("bootjartmp").toFile(); @@ -407,9 +300,9 @@ class BootJarOperationTest { new BootWarOperation() .fromProject(project) .launcherLibs(List.of(new File(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER))) - .destinationDirectory(tmp_dir.toPath()) - .infLibs(Path.of(EXAMPLES_LIB_COMPILE + SPRING_BOOT), - Path.of(EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR)) + .destinationDirectory(tmp_dir) + .infLibs(new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT), + new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR)) .providedLibs(new File(EXAMPLES_LIB_RUNTIME + PROVIDED_LIB)) .execute(); @@ -427,6 +320,7 @@ class BootJarOperationTest { "WEB-INF/classes/rife/bld/extension/\n" + "WEB-INF/classes/rife/bld/extension/AbstractBootOperation.class\n" + "WEB-INF/classes/rife/bld/extension/BootJarOperation.class\n" + + "WEB-INF/classes/rife/bld/extension/BootManifestAttribute.class\n" + "WEB-INF/classes/rife/bld/extension/BootUtils.class\n" + "WEB-INF/classes/rife/bld/extension/BootWarOperation.class\n" + "WEB-INF/lib/\n" + @@ -440,24 +334,6 @@ class BootJarOperationTest { FileUtils.deleteDirectory(tmp_dir); } - @Test - void testWarProvidedLibs() { - var op = new BootWarOperation(); - - var foo = new File(EXAMPLES_LIB_RUNTIME + PROVIDED_LIB); - op = op.providedLibs(EXAMPLES_LIB_RUNTIME + PROVIDED_LIB); - assertThat(op.providedLibs()).containsExactly(foo); - op.providedLibs().clear(); - - op = op.providedLibs(foo); - assertThat(op.providedLibs()).containsExactly(foo); - op.providedLibs().clear(); - - op = op.providedLibs(foo.toPath()); - assertThat(op.providedLibs()).containsExactly(foo); - op.providedLibs().clear(); - } - static class CustomProject extends Project { CustomProject(File tmp) { super();