From 16f45fad1a7f0c438305733d6a6898a08d20743f Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 20 Jun 2024 18:24:01 -0700 Subject: [PATCH 1/3] Bumped dependencies Spring Boot to version 3.3.1 PMD extension to version 1.0.1 AssertJ to version 3.26.0 --- README.md | 2 +- .../java/com/example/demo/DemoApplicationBuild.java | 10 +++++----- lib/bld/bld-wrapper.properties | 4 ++-- src/bld/java/rife/bld/extension/SpringBootBuild.java | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 487b80a..e830213 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ Don't forget to include the _Spring Boot Loader_ dependency to your project: ```java scope(standalone) - .include(dependency("org.springframeworkboot:spring-boot-loader:3.3.0")); + .include(dependency("org.springframeworkboot:spring-boot-loader:3.3.1")); ``` Please check the [BootJarOperation documentation](https://rife2.github.io/bld-spring-boot/rife/bld/extension/BootJarOperation.html#method-summary) diff --git a/examples/src/bld/java/com/example/demo/DemoApplicationBuild.java b/examples/src/bld/java/com/example/demo/DemoApplicationBuild.java index 087e691..d3e58c2 100644 --- a/examples/src/bld/java/com/example/demo/DemoApplicationBuild.java +++ b/examples/src/bld/java/com/example/demo/DemoApplicationBuild.java @@ -27,15 +27,15 @@ public class DemoApplicationBuild extends WebProject { repositories = List.of(MAVEN_CENTRAL); scope(compile) - .include(dependency("org.springframework.boot:spring-boot-starter:3.3.0")) - .include(dependency("org.springframework.boot:spring-boot-starter-actuator:3.3.0")) - .include(dependency("org.springframework.boot:spring-boot-starter-web:3.3.0")); + .include(dependency("org.springframework.boot:spring-boot-starter:3.3.1")) + .include(dependency("org.springframework.boot:spring-boot-starter-actuator:3.3.1")) + .include(dependency("org.springframework.boot:spring-boot-starter-web:3.3.1")); scope(test) - .include(dependency("org.springframework.boot:spring-boot-starter-test:3.3.0")) + .include(dependency("org.springframework.boot:spring-boot-starter-test:3.3.1")) .include(dependency("org.junit.jupiter:junit-jupiter:5.10.2")) .include(dependency("org.junit.platform:junit-platform-console-standalone:1.10.2")); scope(standalone) - .include(dependency("org.springframework.boot:spring-boot-loader:3.3.0")); + .include(dependency("org.springframework.boot:spring-boot-loader:3.3.1")); } public static void main(String[] args) { diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 4cbfb76..e317c92 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.9 -bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_RELEASES bld.downloadLocation= +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.0.1 +bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_RELEASES bld.sourceDirectories= bld.version=1.9.1 diff --git a/src/bld/java/rife/bld/extension/SpringBootBuild.java b/src/bld/java/rife/bld/extension/SpringBootBuild.java index 79968bb..8c98912 100644 --- a/src/bld/java/rife/bld/extension/SpringBootBuild.java +++ b/src/bld/java/rife/bld/extension/SpringBootBuild.java @@ -47,7 +47,7 @@ public class SpringBootBuild extends Project { scope(test) .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2))) .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 2))) - .include(dependency("org.assertj", "assertj-core", version(3, 25, 3))); + .include(dependency("org.assertj", "assertj-core", version(3, 26, 0))); javadocOperation() .javadocOptions() From 3a08a9d845774868ec6f984a41a477b85c542cd5 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 20 Jun 2024 18:32:43 -0700 Subject: [PATCH 2/3] Use Collection/Map instead of List whenever applicable --- .../bld/extension/AbstractBootOperation.java | 122 +++++++++++++----- .../rife/bld/extension/BootJarOperation.java | 13 +- .../bld/extension/BootManifestAttribute.java | 28 ---- .../rife/bld/extension/BootWarOperation.java | 12 +- .../bld/extension/BootJarOperationTest.java | 30 ++--- 5 files changed, 120 insertions(+), 85 deletions(-) delete mode 100644 src/main/java/rife/bld/extension/BootManifestAttribute.java diff --git a/src/main/java/rife/bld/extension/AbstractBootOperation.java b/src/main/java/rife/bld/extension/AbstractBootOperation.java index 4709c5f..a485812 100644 --- a/src/main/java/rife/bld/extension/AbstractBootOperation.java +++ b/src/main/java/rife/bld/extension/AbstractBootOperation.java @@ -26,10 +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.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; import java.util.spi.ToolProvider; @@ -45,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 List infLibs_ = new ArrayList<>(); - private final List launcherLibs_ = new ArrayList<>(); - private final List manifestAttributes_ = new ArrayList<>(); - private final List sourceDirectories_ = new ArrayList<>(); + 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 File destinationDirectory_; private String destinationFileName_; private String launcherClass_; @@ -239,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 manifestAttribute : manifestAttributes()) { - fileWriter.write(manifestAttribute.name() + ": " + manifestAttribute.value() + System.lineSeparator()); + for (var set : manifestAttributes_.entrySet()) { + fileWriter.write(set.getKey() + ": " + set.getValue() + System.lineSeparator()); } } } @@ -278,12 +278,24 @@ public abstract class AbstractBootOperation> return (T) this; } + /** + * 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 + */ + public T infLibs(String... jars) { + infLibs_.addAll(Arrays.stream(jars).map(File::new).toList()); + //noinspection unchecked + return (T) this; + } + /** * Retrieves the libraries in {@code BOOT-INF} or {@code WEB-INF}. * - * @return a list of Java archives + * @return the Java archives */ - public List infLibs() { + public Collection infLibs() { return infLibs_; } @@ -321,9 +333,9 @@ public abstract class AbstractBootOperation> /** * Retrieves the Spring Boot loader launcher libraries. * - * @return a list of Java archives + * @return the Java archives */ - public List launcherLibs() { + public Collection launcherLibs() { return launcherLibs_; } @@ -332,16 +344,55 @@ public abstract class AbstractBootOperation> * * @param jars a collection of Java archives * @return this operation instance - * @throws IOException if an error occurs + * @throws IOException if a JAR could not be found */ public T launcherLibs(Collection jars) throws IOException { - 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); - } + 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 + */ + @SuppressWarnings("UnusedReturnValue") + public T launcherLibs(File... 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); + } + } + //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 + */ + @SuppressWarnings("UnusedReturnValue") + public T launcherLibs(String... jars) throws IOException { + for (var j : jars) { + var p = Path.of(j); + if (Files.exists(p)) { + launcherLibs_.add(p.toFile()); + } else { + throw new IOException("Spring Boot loader launcher library not found: " + j); } } //noinspection unchecked @@ -377,17 +428,17 @@ public abstract class AbstractBootOperation> * @return this operation instance */ public T manifestAttribute(String name, String value) { - manifestAttributes_.add(new BootManifestAttribute(name, value)); + manifestAttributes_.put(name, value); //noinspection unchecked return (T) this; } /** - * Retrieves the list of attributes that will be put in the archive manifest. + * Retrieves the attributes that will be put in the archive manifest. * - * @return a list of manifest attributes + * @return the manifest attributes */ - public List manifestAttributes() { + public Map manifestAttributes() { return manifestAttributes_; } @@ -396,9 +447,10 @@ public abstract class AbstractBootOperation> * * @param attributes the manifest attributes * @return this operation instance + * @see #manifestAttribute(String, String) */ - public T manifestAttributes(Collection attributes) { - manifestAttributes_.addAll(attributes); + public T manifestAttributes(Map attributes) { + manifestAttributes_.putAll(attributes); //noinspection unchecked return (T) this; } @@ -415,12 +467,24 @@ public abstract class AbstractBootOperation> 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 + */ + public T sourceDirectories(String... directories) { + sourceDirectories_.addAll(Arrays.stream(directories).map(File::new).toList()); + //noinspection unchecked + return (T) this; + } + /** * Retrieves the source directories that will be used for the archive creation. * - * @return a list of directories + * @return the source directories */ - public List sourceDirectories() { + public Collection sourceDirectories() { return sourceDirectories_; } diff --git a/src/main/java/rife/bld/extension/BootJarOperation.java b/src/main/java/rife/bld/extension/BootJarOperation.java index 5667bfd..22edfe9 100644 --- a/src/main/java/rife/bld/extension/BootJarOperation.java +++ b/src/main/java/rife/bld/extension/BootJarOperation.java @@ -23,7 +23,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.Collection; -import java.util.List; +import java.util.Map; 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(Collection) manifest attributes}
  • + * {@link #manifestAttributes() manifest attributes} *
  • The {@link #sourceDirectories(File...) source directories} to * {@link Project#buildMainDirectory() buildMainDirectory} and * {@link Project#srcMainResourcesDirectory() srcMainResourcesDirectory}
  • @@ -107,11 +107,10 @@ public class BootJarOperation extends AbstractBootOperation { .launcherClass(BootUtils.launcherClass(project, "JarLauncher")) .launcherLibs(project.standaloneClasspathJars()) .mainClass(project.mainClass()) - .manifestAttributes(List.of( - new BootManifestAttribute("Manifest-Version", "1.0"), - new BootManifestAttribute("Main-Class", launcherClass()), - new BootManifestAttribute("Start-Class", mainClass()) - )) + .manifestAttributes(Map.of( + "Manifest-Version", "1.0", + "Main-Class", launcherClass(), + "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 deleted file mode 100644 index beac96d..0000000 --- a/src/main/java/rife/bld/extension/BootManifestAttribute.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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/BootWarOperation.java b/src/main/java/rife/bld/extension/BootWarOperation.java index 7ee8db7..9362df4 100644 --- a/src/main/java/rife/bld/extension/BootWarOperation.java +++ b/src/main/java/rife/bld/extension/BootWarOperation.java @@ -25,6 +25,7 @@ import java.nio.file.Files; 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; @@ -112,7 +113,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(Collection) manifest attributes}
  • + * {@link #manifestAttributes() manifest attributes} *
  • The {@link #sourceDirectories(File...) source directories} to * {@link Project#buildMainDirectory() buildMainDirectory} and * {@link Project#srcMainResourcesDirectory() srcMainResourcesDirectory}
  • @@ -131,11 +132,10 @@ public class BootWarOperation extends AbstractBootOperation { .launcherClass(BootUtils.launcherClass(project, "WarLauncher")) .launcherLibs(project.standaloneClasspathJars()) .mainClass(project.mainClass()) - .manifestAttributes(List.of( - new BootManifestAttribute("Manifest-Version", "1.0"), - new BootManifestAttribute("Main-Class", launcherClass()), - new BootManifestAttribute("Start-Class", mainClass()) - )) + .manifestAttributes(Map.of( + "Manifest-Version", "1.0", + "Main-Class", launcherClass(), + "Start-Class", mainClass())) .providedLibs(project.providedClasspathJars()) .sourceDirectories(project.buildMainDirectory(), project.srcMainResourcesDirectory()); } diff --git a/src/test/java/rife/bld/extension/BootJarOperationTest.java b/src/test/java/rife/bld/extension/BootJarOperationTest.java index 77c215a..c5d5508 100644 --- a/src/test/java/rife/bld/extension/BootJarOperationTest.java +++ b/src/test/java/rife/bld/extension/BootJarOperationTest.java @@ -35,7 +35,7 @@ import static org.assertj.core.api.Assertions.assertThatCode; class BootJarOperationTest { private static final String BLD = "bld-1.9.1.jar"; - private static final String BOOT_VERSION = "3.3.0"; + private static final String BOOT_VERSION = "3.3.1"; 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/"; @@ -180,7 +180,13 @@ class BootJarOperationTest { .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("class required"); - assertThatCode(() -> new BootWarOperation().launcherLibs(List.of(new File("foo")))) + assertThatCode(() -> new BootWarOperation().launcherLibs(new File("foo"))) + .as("foo") + .isInstanceOf(IOException.class) + .hasMessageContaining("not found"); + + assertThatCode(() -> new BootWarOperation().launcherLibs("bar")) + .as("bar") .isInstanceOf(IOException.class) .hasMessageContaining("not found"); @@ -221,7 +227,6 @@ 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" + @@ -239,9 +244,9 @@ class BootJarOperationTest { new BootJarOperation() .fromProject(new CustomProject(new File("."))) .launcherLibs(List.of(new File(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER))) - .destinationDirectory(tmp_dir) - .infLibs(new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT), - new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR)) + .destinationDirectory(tmp_dir.getAbsolutePath()) + .infLibs(new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT).getAbsolutePath(), + new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR).getAbsolutePath()) .execute(); var jarFile = new File(tmp_dir, "test_project-0.0.1-boot.jar"); @@ -256,7 +261,6 @@ 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" + @@ -278,14 +282,11 @@ class BootJarOperationTest { 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.manifestAttributes().get("Manifest-Version")).as("Manifest-Version").isEqualTo("1.0"); + assertThat(bootJar.manifestAttributes().get("Main-Class")).as("Main-Class").endsWith("JarLauncher"); + assertThat(bootJar.manifestAttributes().get("Start-Class")).as("Start-Class").isEqualTo(MAIN_CLASS); assertThat(bootJar.manifestAttribute("Manifest-Test", "tsst") - .manifestAttributes()).as("Manifest-Test").hasSize(4) - .element(3).extracting(BootManifestAttribute::name).isEqualTo("Manifest-Test"); + .manifestAttributes().get("Manifest-Test")).as("Manifest-Test").isEqualTo("tsst"); assertThat(bootJar.destinationDirectory()).as("destinationDirectory").isDirectory(); assertThat(bootJar.destinationDirectory().getAbsolutePath()).as("destinationDirectory") .isEqualTo(Path.of(tmp_dir.getPath(), "build", "dist").toString()); @@ -323,7 +324,6 @@ 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" + From 859a1e73a2b24a61752f3029285c159ff500a7b5 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 20 Jun 2024 18:42:45 -0700 Subject: [PATCH 3/3] Version 0.9.5 --- examples/lib/bld/bld-wrapper.properties | 4 ++-- src/bld/java/rife/bld/extension/SpringBootBuild.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 1ab774a..aba8240 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.extensions=com.uwyn.rife2:bld-spring-boot:0.9.4 -bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.downloadLocation= +bld.extension-boot=com.uwyn.rife2:bld-spring-boot:0.9.5 +bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=1.9.1 diff --git a/src/bld/java/rife/bld/extension/SpringBootBuild.java b/src/bld/java/rife/bld/extension/SpringBootBuild.java index 8c98912..90598cf 100644 --- a/src/bld/java/rife/bld/extension/SpringBootBuild.java +++ b/src/bld/java/rife/bld/extension/SpringBootBuild.java @@ -33,7 +33,7 @@ public class SpringBootBuild extends Project { public SpringBootBuild() { pkg = "rife.bld.extension"; name = "bld-spring-boot"; - version = version(0, 9, 5, "SNAPSHOT"); + version = version(0, 9, 5); javaRelease = 17;