Compare commits
No commits in common. "main" and "0.9.8" have entirely different histories.
26 changed files with 530 additions and 852 deletions
27
.github/workflows/bld.yml
vendored
27
.github/workflows/bld.yml
vendored
|
@ -1,15 +1,14 @@
|
|||
name: bld-ci
|
||||
|
||||
on: [ push, pull_request, workflow_dispatch ]
|
||||
on: [push, pull_request, workflow_dispatch]
|
||||
|
||||
jobs:
|
||||
build-bld-project:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
java-version: [ 17, 21, 24 ]
|
||||
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
java-version: [17, 21, 22]
|
||||
|
||||
steps:
|
||||
- name: Checkout source repository
|
||||
|
@ -23,24 +22,12 @@ jobs:
|
|||
distribution: "zulu"
|
||||
java-version: ${{ matrix.java-version }}
|
||||
|
||||
- name: Download dependencies
|
||||
run: ./bld download
|
||||
|
||||
- name: Download dependencies [examples]
|
||||
working-directory: examples
|
||||
run: ./bld download
|
||||
|
||||
- name: Run tests [examples]
|
||||
working-directory: examples
|
||||
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
|
||||
|
|
6
.github/workflows/pages.yml
vendored
6
.github/workflows/pages.yml
vendored
|
@ -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:
|
||||
|
@ -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/"
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v4
|
||||
uses: actions/deploy-pages@v1
|
||||
|
|
4
.idea/copyright/Apache_License.xml
generated
4
.idea/copyright/Apache_License.xml
generated
|
@ -1,6 +1,6 @@
|
|||
<component name="CopyrightManager">
|
||||
<copyright>
|
||||
<option name="notice" value="Copyright 2023-&#36;today.year 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." />
|
||||
<option name="notice" value="Copyright 2023-Copyright &#36;today.yearamp;#36;today.year 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." />
|
||||
<option name="myName" value="Apache License" />
|
||||
</copyright>
|
||||
</component>
|
||||
</component>
|
||||
|
|
13
.idea/icon.svg
generated
13
.idea/icon.svg
generated
|
@ -1,13 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 179 108" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1,0,0,1,-210.511,-96.3382)">
|
||||
<g transform="matrix(1,0,0,1,-23.3386,-649.816)">
|
||||
<g transform="matrix(0.221288,0,0,0.24,73.9536,390.254)">
|
||||
<path d="M722.568,1482.92L722.568,1921.1L808.968,1921.1L808.968,1888.7C822.168,1907.9 846.168,1930.1 893.568,1930.1C933.168,1930.1 961.968,1917.5 985.368,1893.5C1012.97,1865.9 1027.37,1827.5 1027.37,1786.1C1027.37,1741.7 1011.17,1705.1 985.368,1680.5C961.968,1658.3 928.968,1644.5 892.368,1644.5C862.968,1644.5 830.568,1654.1 808.968,1683.5L808.968,1482.92L722.568,1482.92ZM871.368,1718.9C888.768,1718.9 903.768,1723.7 917.568,1736.9C930.168,1748.9 938.568,1766.3 938.568,1787.9C938.568,1807.7 930.168,1825.1 917.568,1837.1C904.368,1849.7 887.568,1855.7 872.568,1855.7C856.368,1855.7 837.168,1849.1 823.368,1835.9C813.168,1826.3 803.568,1810.1 803.568,1787.9C803.568,1765.1 812.568,1749.5 822.768,1738.7C836.568,1724.3 852.768,1718.9 871.368,1718.9Z" style="fill:rgb(35,146,255);fill-rule:nonzero;"/>
|
||||
<rect x="1083.77" y="1482.92" width="86.4" height="438.182" style="fill:rgb(250,144,82);fill-rule:nonzero;"/>
|
||||
<path d="M1531.37,1482.92L1444.97,1482.92L1444.97,1683.5C1423.37,1654.1 1390.97,1644.5 1361.57,1644.5C1324.97,1644.5 1291.97,1658.3 1268.57,1680.5C1242.77,1705.1 1226.57,1741.7 1226.57,1786.1C1226.57,1827.5 1240.97,1865.9 1268.57,1893.5C1291.97,1917.5 1320.77,1930.1 1360.37,1930.1C1407.77,1930.1 1431.77,1907.9 1444.97,1888.7L1444.97,1921.1L1531.37,1921.1L1531.37,1482.92ZM1382.57,1718.9C1401.17,1718.9 1417.37,1724.3 1431.17,1738.7C1441.37,1749.5 1450.37,1765.1 1450.37,1787.9C1450.37,1810.1 1440.77,1826.3 1430.57,1835.9C1416.77,1849.1 1397.57,1855.7 1381.37,1855.7C1366.37,1855.7 1349.57,1849.7 1336.37,1837.1C1323.77,1825.1 1315.37,1807.7 1315.37,1787.9C1315.37,1766.3 1323.77,1748.9 1336.37,1736.9C1350.17,1723.7 1365.17,1718.9 1382.57,1718.9Z" style="fill:rgb(35,146,255);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.4 KiB |
4
.idea/libraries/bld.xml
generated
4
.idea/libraries/bld.xml
generated
|
@ -2,12 +2,12 @@
|
|||
<library name="bld">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.1.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.1.0.jar!/" />
|
||||
</SOURCES>
|
||||
<excluded>
|
||||
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />
|
||||
|
|
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
|
@ -18,7 +18,7 @@
|
|||
</option>
|
||||
<option name="skipTestSources" value="false" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="17" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build" />
|
||||
</component>
|
||||
</project>
|
|
@ -1,6 +1,6 @@
|
|||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="BootOperationTests" type="Application" factoryName="Application" nameIsGenerated="true">
|
||||
<option name="MAIN_CLASS_NAME" value="rife.bld.extension.BootOperationTests" />
|
||||
<configuration default="false" name="Run Tests" type="Application" factoryName="Application" nameIsGenerated="true">
|
||||
<option name="MAIN_CLASS_NAME" value="rife.bld.extension.BootJarOperationTest" />
|
||||
<module name="app" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
|
@ -9,7 +9,7 @@
|
|||
],
|
||||
"java.configuration.updateBuildConfiguration": "automatic",
|
||||
"java.project.referencedLibraries": [
|
||||
"${HOME}/.bld/dist/bld-2.2.1.jar",
|
||||
"${HOME}/.bld/dist/bld-2.1.0.jar",
|
||||
"lib/**/*.jar"
|
||||
]
|
||||
}
|
||||
|
|
18
README.md
18
README.md
|
@ -2,20 +2,12 @@
|
|||
|
||||
[](https://opensource.org/licenses/Apache-2.0)
|
||||
[](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
|
||||
[](https://rife2.com/bld)
|
||||
[](https://rife2.com/bld)
|
||||
[](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-spring-boot)
|
||||
[](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-spring-boot)
|
||||
[](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:
|
||||
|
@ -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.5.3"));
|
||||
.include(dependency("org.springframeworkboot:spring-boot-loader:3.3.3"));
|
||||
```
|
||||
|
||||
Please check the [BootJarOperation documentation](https://rife2.github.io/bld-spring-boot/rife/bld/extension/BootJarOperation.html#method-summary)
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
<!-- BEST PRACTICES -->
|
||||
<rule ref="category/java/bestpractices.xml">
|
||||
<exclude name="AvoidPrintStackTrace"/>
|
||||
<exclude name="JUnit4TestShouldUseTestAnnotation"/>
|
||||
<exclude name="JUnitTestContainsTooManyAsserts"/>
|
||||
<exclude name="GuardLogStatement"/>
|
||||
<exclude name="UnitTestContainsTooManyAsserts"/>
|
||||
<exclude name="UnitTestShouldUseTestAnnotation"/>
|
||||
</rule>
|
||||
|
||||
<rule ref="category/java/bestpractices.xml/MissingOverride">
|
||||
|
|
6
examples/.idea/bld.xml
generated
6
examples/.idea/bld.xml
generated
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="BldConfiguration">
|
||||
<events />
|
||||
</component>
|
||||
</project>
|
4
examples/.idea/libraries/bld.xml
generated
4
examples/.idea/libraries/bld.xml
generated
|
@ -2,12 +2,12 @@
|
|||
<library name="bld">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.1.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1-sources.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.1.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
<excluded>
|
||||
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />
|
||||
|
|
5
examples/.vscode/settings.json
vendored
5
examples/.vscode/settings.json
vendored
|
@ -9,8 +9,7 @@
|
|||
],
|
||||
"java.configuration.updateBuildConfiguration": "automatic",
|
||||
"java.project.referencedLibraries": [
|
||||
"${HOME}/.bld/dist/bld-2.2.1.jar",
|
||||
"${HOME}/.bld/dist/bld-2.1.0.jar",
|
||||
"lib/**/*.jar"
|
||||
],
|
||||
"java.compile.nullAnalysis.mode": "automatic"
|
||||
]
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -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.extension-boot=com.uwyn.rife2:bld-spring-boot:0.9.8
|
||||
bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
|
||||
bld.sourceDirectories=
|
||||
bld.version=2.2.1
|
||||
bld.version=2.1.0
|
||||
|
|
|
@ -26,21 +26,16 @@ public class DemoApplicationBuild extends WebProject {
|
|||
|
||||
repositories = List.of(MAVEN_CENTRAL);
|
||||
|
||||
var boot = version(3, 5, 3);
|
||||
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.18.0"));
|
||||
.include(dependency("org.springframework.boot:spring-boot-starter:3.3.3"))
|
||||
.include(dependency("org.springframework.boot:spring-boot-starter-actuator:3.3.3"))
|
||||
.include(dependency("org.springframework.boot:spring-boot-starter-web:3.3.3"));
|
||||
scope(test)
|
||||
.include(dependency("org.springframework.boot", "spring-boot-starter-test", boot))
|
||||
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 13, 1)))
|
||||
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 13, 1)));
|
||||
.include(dependency("org.springframework.boot:spring-boot-starter-test:3.3.3"))
|
||||
.include(dependency("org.junit.jupiter:junit-jupiter:5.11.0"))
|
||||
.include(dependency("org.junit.platform:junit-platform-console-standalone:1.11.0"));
|
||||
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.3.3"));
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
|
Binary file not shown.
|
@ -1,8 +1,7 @@
|
|||
bld.downloadExtensionJavadoc=false
|
||||
bld.downloadExtensionSources=true
|
||||
bld.downloadLocation=
|
||||
bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.5
|
||||
bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.3.0
|
||||
bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.5
|
||||
bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_RELEASES
|
||||
bld.sourceDirectories=
|
||||
bld.version=2.2.1
|
||||
bld.version=2.1.0
|
||||
|
|
|
@ -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,9 +22,6 @@ import rife.bld.publish.PublishDeveloper;
|
|||
import rife.bld.publish.PublishLicense;
|
||||
import rife.bld.publish.PublishScm;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
|
||||
import static rife.bld.dependencies.Repository.*;
|
||||
|
@ -36,7 +33,7 @@ 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, 8);
|
||||
|
||||
javaRelease = 17;
|
||||
|
||||
|
@ -46,11 +43,11 @@ public class SpringBootBuild extends Project {
|
|||
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(2, 1, 0)));
|
||||
scope(test)
|
||||
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 13, 1)))
|
||||
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 13, 1)))
|
||||
.include(dependency("org.assertj", "assertj-core", version(3, 27, 3)));
|
||||
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 0)))
|
||||
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 0)))
|
||||
.include(dependency("org.assertj", "assertj-core", version(3, 26, 3)));
|
||||
|
||||
javadocOperation()
|
||||
.javadocOptions()
|
||||
|
@ -60,26 +57,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("https://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"));
|
||||
|
@ -97,34 +96,4 @@ public class SpringBootBuild extends Project {
|
|||
.ruleSets("config/pmd.xml")
|
||||
.execute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void test() throws Exception {
|
||||
var testResultsDir = "build/test-results/test/";
|
||||
var op = testOperation().fromProject(this);
|
||||
op.testToolOptions().reportsDir(new File(testResultsDir));
|
||||
|
||||
Exception ex = null;
|
||||
try {
|
||||
op.execute();
|
||||
} catch (Exception e) {
|
||||
ex = e;
|
||||
}
|
||||
|
||||
var xunitViewer = new File("/usr/bin/xunit-viewer");
|
||||
if (xunitViewer.exists() && xunitViewer.canExecute()) {
|
||||
var reportsDir = "build/reports/tests/test/";
|
||||
|
||||
Files.createDirectories(Path.of(reportsDir));
|
||||
|
||||
new ExecOperation()
|
||||
.fromProject(this)
|
||||
.command(xunitViewer.getPath(), "-r", testResultsDir, "-o", reportsDir + "index.html")
|
||||
.execute();
|
||||
}
|
||||
|
||||
if (ex != null) {
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
@ -37,7 +37,7 @@ public final class BootUtils {
|
|||
}
|
||||
|
||||
/**
|
||||
* Calculates the given file size in bytes, kilobytes, megabytes, gigabytes, or terabytes.
|
||||
* Calculates the given file size in bytes, kilobytes, megabytes, gigabytes or terabytes.
|
||||
*
|
||||
* @param file the file
|
||||
* @return the file size in B, KB, MB, GB, or TB.
|
||||
|
|
|
@ -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.
|
||||
|
|
466
src/test/java/rife/bld/extension/BootJarOperationTest.java
Normal file
466
src/test/java/rife/bld/extension/BootJarOperationTest.java
Normal file
|
@ -0,0 +1,466 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import rife.bld.Project;
|
||||
import rife.bld.dependencies.VersionNumber;
|
||||
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.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
|
||||
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.1.0.jar";
|
||||
private static final String BOOT_VERSION = "3.3.3";
|
||||
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/";
|
||||
private static final String LAUNCHER_JARS = """
|
||||
org/
|
||||
org/springframework/
|
||||
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
|
||||
org/springframework/boot/loader/jar/NestedJarFile$JarEntryInflaterInputStream.class
|
||||
org/springframework/boot/loader/jar/NestedJarFile$JarEntryInputStream.class
|
||||
org/springframework/boot/loader/jar/NestedJarFile$NestedJarEntry.class
|
||||
org/springframework/boot/loader/jar/NestedJarFile$RawZipDataInputStream.class
|
||||
org/springframework/boot/loader/jar/NestedJarFile$ZipContentEntriesSpliterator.class
|
||||
org/springframework/boot/loader/jar/NestedJarFile.class
|
||||
org/springframework/boot/loader/jar/NestedJarFileResources.class
|
||||
org/springframework/boot/loader/jar/SecurityInfo.class
|
||||
org/springframework/boot/loader/jar/ZipInflaterInputStream.class
|
||||
org/springframework/boot/loader/jarmode/
|
||||
org/springframework/boot/loader/jarmode/JarMode.class
|
||||
org/springframework/boot/loader/launch/
|
||||
org/springframework/boot/loader/launch/Archive$Entry.class
|
||||
org/springframework/boot/loader/launch/Archive.class
|
||||
org/springframework/boot/loader/launch/ClassPathIndexFile.class
|
||||
org/springframework/boot/loader/launch/ExecutableArchiveLauncher.class
|
||||
org/springframework/boot/loader/launch/ExplodedArchive$FileArchiveEntry.class
|
||||
org/springframework/boot/loader/launch/ExplodedArchive.class
|
||||
org/springframework/boot/loader/launch/JarFileArchive$JarArchiveEntry.class
|
||||
org/springframework/boot/loader/launch/JarFileArchive.class
|
||||
org/springframework/boot/loader/launch/JarLauncher.class
|
||||
org/springframework/boot/loader/launch/JarModeRunner.class
|
||||
org/springframework/boot/loader/launch/LaunchedClassLoader$DefinePackageCallType.class
|
||||
org/springframework/boot/loader/launch/LaunchedClassLoader.class
|
||||
org/springframework/boot/loader/launch/Launcher.class
|
||||
org/springframework/boot/loader/launch/PropertiesLauncher$Instantiator$Using.class
|
||||
org/springframework/boot/loader/launch/PropertiesLauncher$Instantiator.class
|
||||
org/springframework/boot/loader/launch/PropertiesLauncher.class
|
||||
org/springframework/boot/loader/launch/SystemPropertyUtils.class
|
||||
org/springframework/boot/loader/launch/WarLauncher.class
|
||||
org/springframework/boot/loader/log/
|
||||
org/springframework/boot/loader/log/DebugLogger$DisabledDebugLogger.class
|
||||
org/springframework/boot/loader/log/DebugLogger$SystemErrDebugLogger.class
|
||||
org/springframework/boot/loader/log/DebugLogger.class
|
||||
org/springframework/boot/loader/net/
|
||||
org/springframework/boot/loader/net/protocol/
|
||||
org/springframework/boot/loader/net/protocol/Handlers.class
|
||||
org/springframework/boot/loader/net/protocol/jar/
|
||||
org/springframework/boot/loader/net/protocol/jar/Canonicalizer.class
|
||||
org/springframework/boot/loader/net/protocol/jar/Handler.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarFileUrlKey.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarUrl.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarUrlClassLoader$OptimizedEnumeration.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarUrlClassLoader.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarUrlConnection$ConnectionInputStream.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarUrlConnection$EmptyUrlStreamHandler.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarUrlConnection.class
|
||||
org/springframework/boot/loader/net/protocol/jar/LazyDelegatingInputStream.class
|
||||
org/springframework/boot/loader/net/protocol/jar/Optimizations.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarEntry.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarFile.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarFileFactory.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarFiles$Cache.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarFiles.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarManifest$ManifestSupplier.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarManifest.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlNestedJarFile.class
|
||||
org/springframework/boot/loader/net/protocol/nested/
|
||||
org/springframework/boot/loader/net/protocol/nested/Handler.class
|
||||
org/springframework/boot/loader/net/protocol/nested/NestedLocation.class
|
||||
org/springframework/boot/loader/net/protocol/nested/NestedUrlConnection$ConnectionInputStream.class
|
||||
org/springframework/boot/loader/net/protocol/nested/NestedUrlConnection.class
|
||||
org/springframework/boot/loader/net/protocol/nested/NestedUrlConnectionResources.class
|
||||
org/springframework/boot/loader/net/util/
|
||||
org/springframework/boot/loader/net/util/UrlDecoder.class
|
||||
org/springframework/boot/loader/nio/
|
||||
org/springframework/boot/loader/nio/file/
|
||||
org/springframework/boot/loader/nio/file/NestedByteChannel$Resources.class
|
||||
org/springframework/boot/loader/nio/file/NestedByteChannel.class
|
||||
org/springframework/boot/loader/nio/file/NestedFileStore.class
|
||||
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
|
||||
org/springframework/boot/loader/zip/
|
||||
org/springframework/boot/loader/zip/ByteArrayDataBlock.class
|
||||
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/NameOffsetLookups.class
|
||||
org/springframework/boot/loader/zip/VirtualDataBlock.class
|
||||
org/springframework/boot/loader/zip/VirtualZipDataBlock$DataPart.class
|
||||
org/springframework/boot/loader/zip/VirtualZipDataBlock.class
|
||||
org/springframework/boot/loader/zip/Zip64EndOfCentralDirectoryLocator.class
|
||||
org/springframework/boot/loader/zip/Zip64EndOfCentralDirectoryRecord.class
|
||||
org/springframework/boot/loader/zip/ZipCentralDirectoryFileHeaderRecord.class
|
||||
org/springframework/boot/loader/zip/ZipContent$Entry.class
|
||||
org/springframework/boot/loader/zip/ZipContent$Kind.class
|
||||
org/springframework/boot/loader/zip/ZipContent$Loader.class
|
||||
org/springframework/boot/loader/zip/ZipContent$Source.class
|
||||
org/springframework/boot/loader/zip/ZipContent.class
|
||||
org/springframework/boot/loader/zip/ZipDataDescriptorRecord.class
|
||||
org/springframework/boot/loader/zip/ZipEndOfCentralDirectoryRecord$Located.class
|
||||
org/springframework/boot/loader/zip/ZipEndOfCentralDirectoryRecord.class
|
||||
org/springframework/boot/loader/zip/ZipLocalFileHeaderRecord.class
|
||||
org/springframework/boot/loader/zip/ZipString$CompareType.class
|
||||
org/springframework/boot/loader/zip/ZipString.class
|
||||
""";
|
||||
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 StringBuilder readJarEntries(File jar) throws IOException {
|
||||
var jarEntries = new StringBuilder();
|
||||
try (var jarFile = new JarFile(jar)) {
|
||||
for (Enumeration<JarEntry> entries = jarFile.entries(); entries.hasMoreElements(); ) {
|
||||
jarEntries.append(entries.nextElement().getName()).append('\n');
|
||||
}
|
||||
}
|
||||
return jarEntries;
|
||||
}
|
||||
|
||||
@Test
|
||||
void testErrors() throws IOException {
|
||||
var bootWar = new BootWarOperation();
|
||||
assertThatCode(bootWar::execute).isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageContaining("mainClass");
|
||||
|
||||
bootWar = bootWar.mainClass(MAIN_CLASS);
|
||||
assertThatCode(bootWar::execute)
|
||||
.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")
|
||||
.isInstanceOf(IOException.class)
|
||||
.hasMessageContaining("not found");
|
||||
|
||||
bootWar = bootWar.launcherLibs(List.of(new File(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER)));
|
||||
assertThatCode(bootWar::execute)
|
||||
.isInstanceOf((IllegalArgumentException.class))
|
||||
.hasMessageContaining("class required");
|
||||
|
||||
bootWar = bootWar.launcherClass("org.springframework.boot.loader.launch.WarLauncher");
|
||||
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 {
|
||||
var tmp_dir = Files.createTempDirectory("bootjartmp").toFile();
|
||||
var jar = "foo-1.1.1.jar";
|
||||
new BootJarOperation()
|
||||
.launcherClass("org.springframework.boot.loader.launch.JarLauncher")
|
||||
.launcherLibs(List.of(new File(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER)))
|
||||
.destinationDirectory(tmp_dir)
|
||||
.destinationFileName(jar)
|
||||
.infLibs(new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT),
|
||||
new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR))
|
||||
.mainClass(MAIN_CLASS)
|
||||
.sourceDirectories(new File("build/main"))
|
||||
.execute();
|
||||
|
||||
var jarFile = new File(tmp_dir, jar);
|
||||
assertThat(jarFile).exists();
|
||||
|
||||
var jarEntries = readJarEntries(jarFile);
|
||||
assertThat(jarEntries).isEqualToIgnoringNewLines(
|
||||
"BOOT-INF/\n" +
|
||||
"BOOT-INF/classes/\n" +
|
||||
"BOOT-INF/classes/rife/\n" +
|
||||
"BOOT-INF/classes/rife/bld/\n" +
|
||||
"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/BootUtils.class\n" +
|
||||
"BOOT-INF/classes/rife/bld/extension/BootWarOperation.class\n" +
|
||||
"BOOT-INF/lib/\n" +
|
||||
"BOOT-INF/lib/" + SPRING_BOOT + '\n' +
|
||||
"BOOT-INF/lib/" + SPRING_BOOT_ACTUATOR + '\n' +
|
||||
"META-INF/\n" +
|
||||
"META-INF/MANIFEST.MF\n" + LAUNCHER_JARS);
|
||||
|
||||
FileUtils.deleteDirectory(tmp_dir);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testJarProjectExecute() throws Exception {
|
||||
var tmp_dir = Files.createTempDirectory("bootwartmp").toFile();
|
||||
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())
|
||||
.execute();
|
||||
|
||||
var jarFile = new File(tmp_dir, "test_project-0.0.1-boot.jar");
|
||||
assertThat(jarFile).exists();
|
||||
|
||||
var jarEntries = readJarEntries(jarFile);
|
||||
assertThat(jarEntries).isEqualToIgnoringNewLines(
|
||||
"BOOT-INF/\n" +
|
||||
"BOOT-INF/classes/\n" +
|
||||
"BOOT-INF/classes/rife/\n" +
|
||||
"BOOT-INF/classes/rife/bld/\n" +
|
||||
"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/BootUtils.class\n" +
|
||||
"BOOT-INF/classes/rife/bld/extension/BootWarOperation.class\n" +
|
||||
"BOOT-INF/lib/\n" +
|
||||
"BOOT-INF/lib/" + BLD + '\n' +
|
||||
"BOOT-INF/lib/" + SPRING_BOOT + '\n' +
|
||||
"BOOT-INF/lib/" + SPRING_BOOT_ACTUATOR + '\n' +
|
||||
"META-INF/\n" +
|
||||
"META-INF/MANIFEST.MF\n" + LAUNCHER_JARS);
|
||||
|
||||
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);
|
||||
|
||||
assertThat(bootJar.mainClass()).as("mainClass").isEqualTo(MAIN_CLASS);
|
||||
assertThat(bootJar.sourceDirectories()).as("sourceDirectories.size").hasSize(3)
|
||||
.containsExactly(project.buildMainDirectory(), project.srcMainResourcesDirectory(),
|
||||
new File(SRC_MAIN_JAVA));
|
||||
assertThat(bootJar.manifestAttributes()).as("manifestAttributes.size").hasSize(3);
|
||||
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().get("Manifest-Test")).as("Manifest-Test").isEqualTo("tsst");
|
||||
assertThat(bootJar.destinationDirectory()).as("destinationDirectory").isDirectory();
|
||||
assertThat(bootJar.destinationDirectory()).isEqualTo(project.buildDistDirectory());
|
||||
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();
|
||||
var project = new CustomProject(new File("."));
|
||||
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))
|
||||
.providedLibs(new File(EXAMPLES_LIB_RUNTIME + PROVIDED_LIB))
|
||||
.execute();
|
||||
|
||||
var warFile = new File(tmp_dir, project.name() + '-' + project.version().toString() + "-boot.war");
|
||||
assertThat(warFile).exists();
|
||||
|
||||
var jarEntries = readJarEntries(warFile);
|
||||
assertThat(jarEntries).isEqualToIgnoringNewLines(
|
||||
"META-INF/\n" +
|
||||
"META-INF/MANIFEST.MF\n" +
|
||||
"WEB-INF/\n" +
|
||||
"WEB-INF/classes/\n" +
|
||||
"WEB-INF/classes/rife/\n" +
|
||||
"WEB-INF/classes/rife/bld/\n" +
|
||||
"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/BootUtils.class\n" +
|
||||
"WEB-INF/classes/rife/bld/extension/BootWarOperation.class\n" +
|
||||
"WEB-INF/lib/\n" +
|
||||
"WEB-INF/lib/" + BLD + '\n' +
|
||||
"WEB-INF/lib/dist/\n" +
|
||||
"WEB-INF/lib/" + SPRING_BOOT + '\n' +
|
||||
"WEB-INF/lib/" + SPRING_BOOT_ACTUATOR + '\n' +
|
||||
"WEB-INF/lib-provided/\n" +
|
||||
"WEB-INF/lib-provided/" + PROVIDED_LIB + '\n' + LAUNCHER_JARS);
|
||||
|
||||
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();
|
||||
workDirectory = tmp;
|
||||
pkg = "com.example";
|
||||
name = "test_project";
|
||||
version = new VersionNumber(0, 0, 1);
|
||||
mainClass = MAIN_CLASS;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,571 +0,0 @@
|
|||
/*
|
||||
* Copyright 2023-2025 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;
|
||||
|
||||
import org.assertj.core.api.AutoCloseableSoftAssertions;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Nested;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import rife.bld.Project;
|
||||
import rife.bld.dependencies.VersionNumber;
|
||||
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.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatCode;
|
||||
|
||||
class BootOperationTests {
|
||||
private static final String BLD = "bld-2.2.1.jar";
|
||||
private static final String BOOT_VERSION = "3.5.3";
|
||||
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/";
|
||||
private static final String LAUNCHER_JARS = """
|
||||
org/
|
||||
org/springframework/
|
||||
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
|
||||
org/springframework/boot/loader/jar/NestedJarFile$JarEntryInflaterInputStream.class
|
||||
org/springframework/boot/loader/jar/NestedJarFile$JarEntryInputStream.class
|
||||
org/springframework/boot/loader/jar/NestedJarFile$NestedJarEntry.class
|
||||
org/springframework/boot/loader/jar/NestedJarFile$RawZipDataInputStream.class
|
||||
org/springframework/boot/loader/jar/NestedJarFile$ZipContentEntriesSpliterator.class
|
||||
org/springframework/boot/loader/jar/NestedJarFile.class
|
||||
org/springframework/boot/loader/jar/NestedJarFileResources.class
|
||||
org/springframework/boot/loader/jar/SecurityInfo.class
|
||||
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
|
||||
org/springframework/boot/loader/launch/ClassPathIndexFile.class
|
||||
org/springframework/boot/loader/launch/ExecutableArchiveLauncher.class
|
||||
org/springframework/boot/loader/launch/ExplodedArchive$FileArchiveEntry.class
|
||||
org/springframework/boot/loader/launch/ExplodedArchive.class
|
||||
org/springframework/boot/loader/launch/JarFileArchive$JarArchiveEntry.class
|
||||
org/springframework/boot/loader/launch/JarFileArchive.class
|
||||
org/springframework/boot/loader/launch/JarLauncher.class
|
||||
org/springframework/boot/loader/launch/JarModeRunner.class
|
||||
org/springframework/boot/loader/launch/LaunchedClassLoader$DefinePackageCallType.class
|
||||
org/springframework/boot/loader/launch/LaunchedClassLoader.class
|
||||
org/springframework/boot/loader/launch/Launcher.class
|
||||
org/springframework/boot/loader/launch/PropertiesLauncher$Instantiator$Using.class
|
||||
org/springframework/boot/loader/launch/PropertiesLauncher$Instantiator.class
|
||||
org/springframework/boot/loader/launch/PropertiesLauncher.class
|
||||
org/springframework/boot/loader/launch/SystemPropertyUtils.class
|
||||
org/springframework/boot/loader/launch/WarLauncher.class
|
||||
org/springframework/boot/loader/log/
|
||||
org/springframework/boot/loader/log/DebugLogger$DisabledDebugLogger.class
|
||||
org/springframework/boot/loader/log/DebugLogger$SystemErrDebugLogger.class
|
||||
org/springframework/boot/loader/log/DebugLogger.class
|
||||
org/springframework/boot/loader/net/
|
||||
org/springframework/boot/loader/net/protocol/
|
||||
org/springframework/boot/loader/net/protocol/Handlers.class
|
||||
org/springframework/boot/loader/net/protocol/jar/
|
||||
org/springframework/boot/loader/net/protocol/jar/Canonicalizer.class
|
||||
org/springframework/boot/loader/net/protocol/jar/Handler.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarFileUrlKey.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarUrl.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarUrlClassLoader$OptimizedEnumeration.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarUrlClassLoader.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarUrlConnection$ConnectionInputStream.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarUrlConnection$EmptyUrlStreamHandler.class
|
||||
org/springframework/boot/loader/net/protocol/jar/JarUrlConnection.class
|
||||
org/springframework/boot/loader/net/protocol/jar/LazyDelegatingInputStream.class
|
||||
org/springframework/boot/loader/net/protocol/jar/Optimizations.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarEntry.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarFile.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarFileFactory.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarFiles$Cache.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarFiles.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarManifest$ManifestSupplier.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlJarManifest.class
|
||||
org/springframework/boot/loader/net/protocol/jar/UrlNestedJarFile.class
|
||||
org/springframework/boot/loader/net/protocol/nested/
|
||||
org/springframework/boot/loader/net/protocol/nested/Handler.class
|
||||
org/springframework/boot/loader/net/protocol/nested/NestedLocation.class
|
||||
org/springframework/boot/loader/net/protocol/nested/NestedUrlConnection$ConnectionInputStream.class
|
||||
org/springframework/boot/loader/net/protocol/nested/NestedUrlConnection.class
|
||||
org/springframework/boot/loader/net/protocol/nested/NestedUrlConnectionResources.class
|
||||
org/springframework/boot/loader/net/util/
|
||||
org/springframework/boot/loader/net/util/UrlDecoder.class
|
||||
org/springframework/boot/loader/nio/
|
||||
org/springframework/boot/loader/nio/file/
|
||||
org/springframework/boot/loader/nio/file/NestedByteChannel$Resources.class
|
||||
org/springframework/boot/loader/nio/file/NestedByteChannel.class
|
||||
org/springframework/boot/loader/nio/file/NestedFileStore.class
|
||||
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
|
||||
org/springframework/boot/loader/zip/
|
||||
org/springframework/boot/loader/zip/ByteArrayDataBlock.class
|
||||
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/NameOffsetLookups.class
|
||||
org/springframework/boot/loader/zip/VirtualDataBlock.class
|
||||
org/springframework/boot/loader/zip/VirtualZipDataBlock$DataPart.class
|
||||
org/springframework/boot/loader/zip/VirtualZipDataBlock.class
|
||||
org/springframework/boot/loader/zip/Zip64EndOfCentralDirectoryLocator.class
|
||||
org/springframework/boot/loader/zip/Zip64EndOfCentralDirectoryRecord.class
|
||||
org/springframework/boot/loader/zip/ZipCentralDirectoryFileHeaderRecord.class
|
||||
org/springframework/boot/loader/zip/ZipContent$Entry.class
|
||||
org/springframework/boot/loader/zip/ZipContent$Kind.class
|
||||
org/springframework/boot/loader/zip/ZipContent$Loader.class
|
||||
org/springframework/boot/loader/zip/ZipContent$Source.class
|
||||
org/springframework/boot/loader/zip/ZipContent.class
|
||||
org/springframework/boot/loader/zip/ZipDataDescriptorRecord.class
|
||||
org/springframework/boot/loader/zip/ZipEndOfCentralDirectoryRecord$Located.class
|
||||
org/springframework/boot/loader/zip/ZipEndOfCentralDirectoryRecord.class
|
||||
org/springframework/boot/loader/zip/ZipLocalFileHeaderRecord.class
|
||||
org/springframework/boot/loader/zip/ZipString$CompareType.class
|
||||
org/springframework/boot/loader/zip/ZipString.class
|
||||
""";
|
||||
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 StringBuilder readJarEntries(File jar) throws IOException {
|
||||
var jarEntries = new StringBuilder();
|
||||
try (var jarFile = new JarFile(jar)) {
|
||||
for (Enumeration<JarEntry> entries = jarFile.entries(); entries.hasMoreElements(); ) {
|
||||
jarEntries.append(entries.nextElement().getName()).append('\n');
|
||||
}
|
||||
}
|
||||
return jarEntries;
|
||||
}
|
||||
|
||||
static class CustomProject extends Project {
|
||||
CustomProject(File tmp) {
|
||||
super();
|
||||
workDirectory = tmp;
|
||||
pkg = "com.example";
|
||||
name = "test_project";
|
||||
version = new VersionNumber(0, 0, 1);
|
||||
mainClass = MAIN_CLASS;
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Errors Tests")
|
||||
class ErrorsTests {
|
||||
@Test
|
||||
void invalidMainClass() {
|
||||
var bootWar = new BootWarOperation().mainClass(MAIN_CLASS);
|
||||
assertThatCode(bootWar::execute)
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageContaining("class required");
|
||||
}
|
||||
|
||||
@Test
|
||||
void launcherClass() throws IOException {
|
||||
var bootWar = new BootJarOperation().mainClass(MAIN_CLASS)
|
||||
.launcherClass("org.springframework.boot.loader.launch.WarLauncher")
|
||||
.launcherLibs(List.of(new File(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER)));
|
||||
assertThat(bootWar.verifyExecute()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void misingLauncherLibs() {
|
||||
assertThatCode(() -> new BootWarOperation().launcherLibs("bar"))
|
||||
.as("bar")
|
||||
.isInstanceOf(IOException.class)
|
||||
.hasMessageContaining("not found");
|
||||
}
|
||||
|
||||
@Test
|
||||
void misingLauncherLibsAsFile() {
|
||||
assertThatCode(() -> new BootWarOperation().launcherLibs(new File("foo")))
|
||||
.as("foo")
|
||||
.isInstanceOf(IOException.class)
|
||||
.hasMessageContaining("not found");
|
||||
}
|
||||
|
||||
@Test
|
||||
void missingLauncherClass() throws IOException {
|
||||
var bootWar = new BootWarOperation().mainClass(MAIN_CLASS)
|
||||
.launcherLibs(List.of(new File(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER)));
|
||||
assertThatCode(bootWar::execute)
|
||||
.isInstanceOf((IllegalArgumentException.class))
|
||||
.hasMessageContaining("class required");
|
||||
}
|
||||
|
||||
@Test
|
||||
void missingMainClass() {
|
||||
var bootWar = new BootWarOperation();
|
||||
assertThatCode(bootWar::execute).isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageContaining("mainClass");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Libs Tests")
|
||||
class LibsTests {
|
||||
@Nested
|
||||
@DisplayName("Inf Lib Tests")
|
||||
class InfLibTest {
|
||||
private final File bar = new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR);
|
||||
private final File foo = new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT);
|
||||
private final BootWarOperation op = new BootWarOperation();
|
||||
|
||||
@Test
|
||||
void infLibsAsFileArray() {
|
||||
op.infLibs().clear();
|
||||
op.infLibs(foo, bar);
|
||||
assertThat(op.infLibs()).as("File...").containsExactly(foo, bar);
|
||||
}
|
||||
|
||||
@Test
|
||||
void infLibsAsFileList() {
|
||||
op.infLibs().clear();
|
||||
op.infLibs(List.of(foo, bar));
|
||||
assertThat(op.infLibs()).as("List(File...)").containsExactly(foo, bar);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
void infLibsAsPathArray() {
|
||||
op.infLibs().clear();
|
||||
op.infLibs(foo.toPath(), bar.toPath());
|
||||
assertThat(op.infLibs()).as("Path...").containsExactly(foo, bar);
|
||||
}
|
||||
|
||||
@Test
|
||||
void infLibsAsPathList() {
|
||||
op.infLibs().clear();
|
||||
op.infLibsPaths(List.of(foo.toPath(), bar.toPath()));
|
||||
assertThat(op.infLibs()).as("List(Path...)").containsExactly(foo, bar);
|
||||
}
|
||||
|
||||
@Test
|
||||
void infLibsAsStringArray() {
|
||||
op.infLibs().clear();
|
||||
op.infLibs(EXAMPLES_LIB_COMPILE + SPRING_BOOT, EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR);
|
||||
assertThat(op.infLibs()).as("String...").containsExactly(foo, bar);
|
||||
}
|
||||
|
||||
@Test
|
||||
void infLibsAsStringList() {
|
||||
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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Launcher Libs Tests")
|
||||
class LauncherLibTests {
|
||||
private final File launcher = new File(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER);
|
||||
private final BootJarOperation op = new BootJarOperation();
|
||||
|
||||
@Test
|
||||
void launcherLibsAsFileArray() throws IOException {
|
||||
op.launcherLibs().clear();
|
||||
op.launcherLibs(launcher);
|
||||
assertThat(op.launcherLibs()).as("File...").containsExactly(launcher);
|
||||
}
|
||||
|
||||
@Test
|
||||
void launcherLibsAsFileList() throws IOException {
|
||||
op.launcherLibs().clear();
|
||||
op.launcherLibs(List.of(launcher));
|
||||
assertThat(op.launcherLibs()).as("List(File...)").containsExactly(launcher);
|
||||
}
|
||||
|
||||
@Test
|
||||
void launcherLibsAsPathArray() throws IOException {
|
||||
op.launcherLibs().clear();
|
||||
op.launcherLibs(launcher.toPath());
|
||||
assertThat(op.launcherLibs()).as("Path...").containsExactly(launcher);
|
||||
}
|
||||
|
||||
@Test
|
||||
void launcherLibsAsPathList() throws IOException {
|
||||
op.launcherLibs().clear();
|
||||
op.launcherLibsPaths(List.of(launcher.toPath()));
|
||||
assertThat(op.launcherLibs()).as("List(Path...)").containsExactly(launcher);
|
||||
}
|
||||
|
||||
@Test
|
||||
void launcherLibsAsStringArray() throws IOException {
|
||||
op.launcherLibs().clear();
|
||||
op.launcherLibs(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER);
|
||||
assertThat(op.launcherLibs()).as("String...").containsExactly(launcher);
|
||||
}
|
||||
|
||||
@Test
|
||||
void launcherLibsAsStringList() throws IOException {
|
||||
op.launcherLibs().clear();
|
||||
op.launcherLibsStrings(List.of(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER));
|
||||
assertThat(op.launcherLibs()).as("List(String...)").containsExactly(launcher);
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("War Libs Tests")
|
||||
class WarLibTest {
|
||||
private final File foo = new File(EXAMPLES_LIB_RUNTIME + PROVIDED_LIB);
|
||||
private final BootWarOperation op = new BootWarOperation();
|
||||
|
||||
@Test
|
||||
void warProvidedLibs() {
|
||||
op.providedLibs().clear();
|
||||
op.providedLibs(foo);
|
||||
assertThat(op.providedLibs()).containsExactly(foo);
|
||||
}
|
||||
|
||||
@Test
|
||||
void warProvidedLibsAsPath() {
|
||||
op.providedLibs().clear();
|
||||
op.providedLibs(foo.toPath());
|
||||
assertThat(op.providedLibs()).containsExactly(foo);
|
||||
}
|
||||
|
||||
@Test
|
||||
void warProvidedLibsAsString() {
|
||||
op.providedLibs().clear();
|
||||
op.providedLibs(EXAMPLES_LIB_RUNTIME + PROVIDED_LIB);
|
||||
assertThat(op.providedLibs()).containsExactly(foo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Project Tests")
|
||||
class ProjectTests {
|
||||
@Test
|
||||
void customProject() throws IOException {
|
||||
var tmpDir = Files.createTempDirectory("boot-prj-tmp-").toFile();
|
||||
var project = new CustomProject(tmpDir);
|
||||
var bootJar = new BootJarOperation().fromProject(project).sourceDirectories(SRC_MAIN_JAVA);
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
FileUtils.deleteDirectory(tmpDir);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("PMD.AvoidDuplicateLiterals")
|
||||
void jarExecute() throws Exception {
|
||||
var tmpDir = Files.createTempDirectory("bootjartmp").toFile();
|
||||
var jar = "foo-1.1.1.jar";
|
||||
new BootJarOperation()
|
||||
.launcherClass("org.springframework.boot.loader.launch.JarLauncher")
|
||||
.launcherLibs(List.of(new File(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER)))
|
||||
.destinationDirectory(tmpDir)
|
||||
.destinationFileName(jar)
|
||||
.infLibs(new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT),
|
||||
new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR))
|
||||
.mainClass(MAIN_CLASS)
|
||||
.sourceDirectories(new File("build/main"))
|
||||
.execute();
|
||||
|
||||
var jarFile = new File(tmpDir, jar);
|
||||
assertThat(jarFile).exists();
|
||||
|
||||
var jarEntries = readJarEntries(jarFile);
|
||||
assertThat(jarEntries).isEqualToIgnoringNewLines(
|
||||
"BOOT-INF/\n" +
|
||||
"BOOT-INF/classes/\n" +
|
||||
"BOOT-INF/classes/rife/\n" +
|
||||
"BOOT-INF/classes/rife/bld/\n" +
|
||||
"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/BootUtils.class\n" +
|
||||
"BOOT-INF/classes/rife/bld/extension/BootWarOperation.class\n" +
|
||||
"BOOT-INF/lib/\n" +
|
||||
"BOOT-INF/lib/" + SPRING_BOOT + '\n' +
|
||||
"BOOT-INF/lib/" + SPRING_BOOT_ACTUATOR + '\n' +
|
||||
"META-INF/\n" +
|
||||
"META-INF/MANIFEST.MF\n" + LAUNCHER_JARS);
|
||||
|
||||
FileUtils.deleteDirectory(tmpDir);
|
||||
}
|
||||
|
||||
@Test
|
||||
void jarProjectExecute() throws Exception {
|
||||
var tmpDir = Files.createTempDirectory("boot-war-tmp-").toFile();
|
||||
new BootJarOperation()
|
||||
.fromProject(new CustomProject(new File(".")))
|
||||
.launcherLibs(List.of(new File(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER)))
|
||||
.destinationDirectory(tmpDir.getAbsolutePath())
|
||||
.infLibs(new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT).getAbsolutePath(),
|
||||
new File(EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR).getAbsolutePath())
|
||||
.execute();
|
||||
|
||||
var jarFile = new File(tmpDir, "test_project-0.0.1-boot.jar");
|
||||
assertThat(jarFile).exists();
|
||||
|
||||
var jarEntries = readJarEntries(jarFile);
|
||||
assertThat(jarEntries).isEqualToIgnoringNewLines(
|
||||
"BOOT-INF/\n" +
|
||||
"BOOT-INF/classes/\n" +
|
||||
"BOOT-INF/classes/rife/\n" +
|
||||
"BOOT-INF/classes/rife/bld/\n" +
|
||||
"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/BootUtils.class\n" +
|
||||
"BOOT-INF/classes/rife/bld/extension/BootWarOperation.class\n" +
|
||||
"BOOT-INF/lib/\n" +
|
||||
"BOOT-INF/lib/" + BLD + '\n' +
|
||||
"BOOT-INF/lib/" + SPRING_BOOT + '\n' +
|
||||
"BOOT-INF/lib/" + SPRING_BOOT_ACTUATOR + '\n' +
|
||||
"META-INF/\n" +
|
||||
"META-INF/MANIFEST.MF\n" + LAUNCHER_JARS);
|
||||
|
||||
FileUtils.deleteDirectory(tmpDir);
|
||||
}
|
||||
|
||||
@Test
|
||||
void warProjectExecute() throws Exception {
|
||||
var tmpDir = Files.createTempDirectory("bootjartmp").toFile();
|
||||
var project = new CustomProject(new File("."));
|
||||
new BootWarOperation()
|
||||
.fromProject(project)
|
||||
.launcherLibs(List.of(new File(EXAMPLES_LIB_STANDALONE + SPRING_BOOT_LOADER)))
|
||||
.destinationDirectory(tmpDir.toPath())
|
||||
.infLibs(Path.of(EXAMPLES_LIB_COMPILE + SPRING_BOOT),
|
||||
Path.of(EXAMPLES_LIB_COMPILE + SPRING_BOOT_ACTUATOR))
|
||||
.providedLibs(new File(EXAMPLES_LIB_RUNTIME + PROVIDED_LIB))
|
||||
.execute();
|
||||
|
||||
var warFile = new File(tmpDir, project.name() + '-' + project.version().toString() + "-boot.war");
|
||||
assertThat(warFile).exists();
|
||||
|
||||
var jarEntries = readJarEntries(warFile);
|
||||
assertThat(jarEntries).isEqualToIgnoringNewLines(
|
||||
"META-INF/\n" +
|
||||
"META-INF/MANIFEST.MF\n" +
|
||||
"WEB-INF/\n" +
|
||||
"WEB-INF/classes/\n" +
|
||||
"WEB-INF/classes/rife/\n" +
|
||||
"WEB-INF/classes/rife/bld/\n" +
|
||||
"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/BootUtils.class\n" +
|
||||
"WEB-INF/classes/rife/bld/extension/BootWarOperation.class\n" +
|
||||
"WEB-INF/lib/\n" +
|
||||
"WEB-INF/lib/" + BLD + '\n' +
|
||||
"WEB-INF/lib/dist/\n" +
|
||||
"WEB-INF/lib/" + SPRING_BOOT + '\n' +
|
||||
"WEB-INF/lib/" + SPRING_BOOT_ACTUATOR + '\n' +
|
||||
"WEB-INF/lib-provided/\n" +
|
||||
"WEB-INF/lib-provided/" + PROVIDED_LIB + '\n' + LAUNCHER_JARS);
|
||||
|
||||
FileUtils.deleteDirectory(tmpDir);
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Source Directories Tests")
|
||||
class SourceDirectoriesTests {
|
||||
public final BootJarOperation op = new BootJarOperation();
|
||||
public final File src = new File(SRC_MAIN_JAVA);
|
||||
public final File test = new File(SRC_TEST_JAVA);
|
||||
|
||||
@Test
|
||||
void sourceDirectoriesAsFileArray() {
|
||||
op.sourceDirectories().clear();
|
||||
op.sourceDirectories(src, test);
|
||||
assertThat(op.sourceDirectories()).as("File...").containsExactly(src, test);
|
||||
}
|
||||
|
||||
@Test
|
||||
void sourceDirectoriesAsFileList() {
|
||||
op.sourceDirectories().clear();
|
||||
op.sourceDirectories(List.of(src, test));
|
||||
assertThat(op.sourceDirectories()).as("List(File...)").containsExactly(src, test);
|
||||
}
|
||||
|
||||
@Test
|
||||
void sourceDirectoriesAsPathArray() {
|
||||
op.sourceDirectories().clear();
|
||||
op.sourceDirectories(src.toPath(), test.toPath());
|
||||
assertThat(op.sourceDirectories()).as("Path...").containsExactly(src, test);
|
||||
}
|
||||
|
||||
@Test
|
||||
void sourceDirectoriesAsPathList() {
|
||||
op.sourceDirectories().clear();
|
||||
op.sourceDirectoriesPaths(List.of(src.toPath(), test.toPath()));
|
||||
assertThat(op.sourceDirectories()).as("List(Path...)").containsExactly(src, test);
|
||||
}
|
||||
|
||||
@Test
|
||||
void sourceDirectoriesAsStringArray() {
|
||||
op.sourceDirectories().clear();
|
||||
op.sourceDirectories(SRC_MAIN_JAVA, SRC_TEST_JAVA);
|
||||
assertThat(op.sourceDirectories()).as("String...").containsExactly(src, test);
|
||||
}
|
||||
|
||||
@Test
|
||||
void sourceDirectoriesAsStringList() {
|
||||
op.sourceDirectories().clear();
|
||||
op.sourceDirectoriesStrings(List.of(SRC_MAIN_JAVA, SRC_TEST_JAVA));
|
||||
assertThat(op.sourceDirectories()).as("List(String...").containsExactly(src, test);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,135 +0,0 @@
|
|||
/*
|
||||
* Copyright 2023-2025 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;
|
||||
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Nested;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.condition.DisabledOnOs;
|
||||
import org.junit.jupiter.api.condition.OS;
|
||||
import rife.bld.blueprints.BaseProjectBlueprint;
|
||||
import rife.tools.FileUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class BootUtilsTests {
|
||||
@Nested
|
||||
@DisplayName("FileSize Tests")
|
||||
class FileSizeTests {
|
||||
private static final String TMP_FILE_PREFIX = "filesize-tmp-";
|
||||
|
||||
@Test
|
||||
void fileSizeInBytes() throws IOException {
|
||||
var file = File.createTempFile(TMP_FILE_PREFIX, null);
|
||||
file.deleteOnExit();
|
||||
|
||||
Files.write(file.toPath(), "1234".getBytes());
|
||||
assertEquals("4 B", BootUtils.fileSize(file));
|
||||
}
|
||||
|
||||
@Test
|
||||
void fileSizeInGigabytes() {
|
||||
// This test simulates a 3 GB file by mocking the length method
|
||||
var file = new File("testFile") {
|
||||
@Override
|
||||
public long length() {
|
||||
return 3L * 1024 * 1024 * 1024; // 3 GB
|
||||
}
|
||||
};
|
||||
assertEquals("3 GB", BootUtils.fileSize(file));
|
||||
}
|
||||
|
||||
@Test
|
||||
void fileSizeInKilobytes() throws IOException {
|
||||
var file = File.createTempFile(TMP_FILE_PREFIX, null);
|
||||
file.deleteOnExit();
|
||||
|
||||
var data = new byte[1500]; // ~1.46 KB
|
||||
Files.write(file.toPath(), data);
|
||||
|
||||
assertEquals("1.5 KB", BootUtils.fileSize(file));
|
||||
}
|
||||
|
||||
@Test
|
||||
void fileSizeInMegabytes() throws IOException {
|
||||
var file = File.createTempFile(TMP_FILE_PREFIX, null);
|
||||
file.deleteOnExit();
|
||||
|
||||
var data = new byte[5 * 1024 * 1024]; // 5 MB
|
||||
Files.write(file.toPath(), data);
|
||||
|
||||
assertEquals("5 MB", BootUtils.fileSize(file));
|
||||
}
|
||||
|
||||
@Test
|
||||
void fileSizeZeroBytes() throws IOException {
|
||||
var file = File.createTempFile(TMP_FILE_PREFIX, null);
|
||||
file.deleteOnExit();
|
||||
assertEquals("0 B", BootUtils.fileSize(file));
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("LauncherClass Tests")
|
||||
class LauncherClassTests {
|
||||
private final File examplesProjectDir = new File("examples");
|
||||
|
||||
@Test
|
||||
void jarLauncher() {
|
||||
var launcher = BootUtils.launcherClass(new BaseProjectBlueprint(
|
||||
examplesProjectDir, "com.example", "examples", "Examples"), "JarLauncher");
|
||||
assertEquals("org.springframework.boot.loader.JarLauncher", launcher);
|
||||
}
|
||||
|
||||
@Test
|
||||
void warLauncher() {
|
||||
var launcher = BootUtils.launcherClass(new BaseProjectBlueprint(
|
||||
examplesProjectDir, "com.example", "examples", "Examples"), "WarLauncher");
|
||||
assertEquals("org.springframework.boot.loader.WarLauncher", launcher);
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("MkDirs Tests")
|
||||
class MkDirsTests {
|
||||
@Test
|
||||
void mkDirsCreatesDirectories() throws IOException {
|
||||
var tmpDir = File.createTempFile("mkdirs-tmp-", null);
|
||||
FileUtils.deleteDirectory(tmpDir);
|
||||
assertFalse(tmpDir.exists());
|
||||
|
||||
BootUtils.mkDirs(tmpDir);
|
||||
assertTrue(tmpDir.exists());
|
||||
|
||||
FileUtils.deleteDirectory(tmpDir);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisabledOnOs(OS.WINDOWS)
|
||||
void mkDirsThrowsIOException() {
|
||||
var tmpFile = new File("/foo/bar.txt");
|
||||
tmpFile.deleteOnExit();
|
||||
|
||||
var exception = assertThrows(IOException.class, () -> BootUtils.mkDirs(tmpFile));
|
||||
assertEquals("Unable to create: " + tmpFile.getAbsolutePath(), exception.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue