diff --git a/core/jreleaser-assemblers/src/main/java/org/jreleaser/assemblers/NativeImageAssemblerProcessor.java b/core/jreleaser-assemblers/src/main/java/org/jreleaser/assemblers/NativeImageAssemblerProcessor.java index cf66a95d..db4660df 100644 --- a/core/jreleaser-assemblers/src/main/java/org/jreleaser/assemblers/NativeImageAssemblerProcessor.java +++ b/core/jreleaser-assemblers/src/main/java/org/jreleaser/assemblers/NativeImageAssemblerProcessor.java @@ -128,6 +128,8 @@ public class NativeImageAssemblerProcessor extends AbstractAssemblerProcessor copyJars(JReleaserContext context, Path libDirectory) throws AssemblerProcessingException { + private Set copyJars(JReleaserContext context, Path destination) throws AssemblerProcessingException { Set paths = new LinkedHashSet<>(); // resolve all first @@ -199,13 +201,37 @@ public class NativeImageAssemblerProcessor extends AbstractAssemblerProcessor copyFiles(JReleaserContext context, Path destination) throws AssemblerProcessingException { + Set paths = new LinkedHashSet<>(); + + // resolve all first + for (Glob glob : assembler.getFiles()) { + glob.getResolvedPaths(context).stream() + .filter(Files::isRegularFile) + .forEach(paths::add); + } + + // copy all next + try { + Files.createDirectories(destination); + for (Path path : paths) { + context.getLogger().debug("copying {}", path.getFileName()); + Files.copy(path, destination.resolve(path.getFileName()), REPLACE_EXISTING); + } + } catch (IOException e) { + throw new AssemblerProcessingException("Unexpected error when copying files", e); } return paths; diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/NativeImage.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/NativeImage.java index a87fdecb..a2b37a41 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/NativeImage.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/NativeImage.java @@ -35,6 +35,7 @@ public class NativeImage extends AbstractAssembler { private final Artifact graal = new Artifact(); private final Artifact mainJar = new Artifact(); private final List jars = new ArrayList<>(); + private final List files = new ArrayList<>(); public NativeImage() { super(NAME); @@ -51,6 +52,7 @@ public class NativeImage extends AbstractAssembler { setMainJar(nativeImage.mainJar); setArgs(nativeImage.args); setJars(nativeImage.jars); + setFiles(nativeImage.files); } public Artifact getGraal() { @@ -113,6 +115,25 @@ public class NativeImage extends AbstractAssembler { } } + public List getFiles() { + return files; + } + + public void setFiles(List files) { + this.files.clear(); + this.files.addAll(files); + } + + public void addFiles(List files) { + this.files.addAll(files); + } + + public void addFile(Glob file) { + if (null != file) { + this.files.add(file); + } + } + @Override protected void asMap(boolean full, Map props) { props.put("graal", graal.asMap(full)); @@ -122,5 +143,10 @@ public class NativeImage extends AbstractAssembler { mappedJars.put("glob " + i, jars.get(i).asMap(full)); } props.put("jars", mappedJars); + Map> mappedFiles = new LinkedHashMap<>(); + for (int i = 0; i < files.size(); i++) { + mappedFiles.put("glob " + i, files.get(i).asMap(full)); + } + props.put("files", mappedFiles); } } diff --git a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/NativeImage.groovy b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/NativeImage.groovy index 45b63cde..86cac94b 100644 --- a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/NativeImage.groovy +++ b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/NativeImage.groovy @@ -38,9 +38,13 @@ interface NativeImage extends Assembler { void jars(Action action) + void files(Action action) + void graal(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = Artifact) Closure action) void mainJar(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = Artifact) Closure action) void jars(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = Glob) Closure action) + + void files(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = Glob) Closure action) } \ No newline at end of file diff --git a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/NativeImageImpl.groovy b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/NativeImageImpl.groovy index d525522d..f8744fab 100644 --- a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/NativeImageImpl.groovy +++ b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/NativeImageImpl.groovy @@ -48,6 +48,7 @@ class NativeImageImpl extends AbstractAssembler implements NativeImage { private final ArtifactImpl graal private final ArtifactImpl mainJar private final NamedDomainObjectContainer jars + private final NamedDomainObjectContainer files @Inject NativeImageImpl(ObjectFactory objects) { @@ -65,6 +66,14 @@ class NativeImageImpl extends AbstractAssembler implements NativeImage { glob } }) + files = objects.domainObjectContainer(GlobImpl, new NamedDomainObjectFactory() { + @Override + GlobImpl create(String name) { + GlobImpl glob = objects.newInstance(GlobImpl, objects) + glob.name = name + glob + } + }) } @Override @@ -89,6 +98,11 @@ class NativeImageImpl extends AbstractAssembler implements NativeImage { action.execute(jars.maybeCreate("jars-${jars.size()}".toString())) } + @Override + void files(Action action) { + action.execute(files.maybeCreate("files-${files.size()}".toString())) + } + @Override void graal(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = Artifact) Closure action) { ConfigureUtil.configure(action, graal) @@ -104,6 +118,11 @@ class NativeImageImpl extends AbstractAssembler implements NativeImage { ConfigureUtil.configure(action, jars.maybeCreate("jars-${jars.size()}".toString())) } + @Override + void files(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = Glob) Closure action) { + ConfigureUtil.configure(action, files.maybeCreate("files-${files.size()}".toString())) + } + @Override void setActive(String str) { if (isNotBlank(str)) { @@ -122,6 +141,9 @@ class NativeImageImpl extends AbstractAssembler implements NativeImage { for (GlobImpl glob : jars) { nativeImage.addJar(glob.toModel()) } + for (GlobImpl glob : files) { + nativeImage.addFile(glob.toModel()) + } nativeImage } } diff --git a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/NativeImage.java b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/NativeImage.java index 35ce0322..7bb24bc2 100644 --- a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/NativeImage.java +++ b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/NativeImage.java @@ -20,8 +20,6 @@ package org.jreleaser.maven.plugin; import java.util.ArrayList; import java.util.List; -import static org.jreleaser.util.StringUtils.isNotBlank; - /** * @author Andres Almiray * @since 0.2.0 @@ -31,6 +29,7 @@ public class NativeImage extends AbstractAssembler { private final Artifact graal = new Artifact(); private final Artifact mainJar = new Artifact(); private final List jars = new ArrayList<>(); + private final List files = new ArrayList<>(); void setAll(NativeImage nativeImage) { super.setAll(nativeImage); @@ -38,6 +37,7 @@ public class NativeImage extends AbstractAssembler { setMainJar(nativeImage.mainJar); setArgs(nativeImage.args); setJars(nativeImage.jars); + setFiles(nativeImage.files); } public Artifact getGraal() { @@ -65,22 +65,6 @@ public class NativeImage extends AbstractAssembler { this.args.addAll(args); } - public void addArgs(List args) { - this.args.addAll(args); - } - - public void addArg(String arg) { - if (isNotBlank(arg)) { - this.args.add(arg.trim()); - } - } - - public void removeArg(String arg) { - if (isNotBlank(arg)) { - this.args.remove(arg.trim()); - } - } - public List getJars() { return jars; } @@ -90,13 +74,12 @@ public class NativeImage extends AbstractAssembler { this.jars.addAll(jars); } - public void addJars(List jars) { - this.jars.addAll(jars); + public List getFiles() { + return files; } - public void addJar(Glob jar) { - if (null != jar) { - this.jars.add(jar); - } + public void setFiles(List files) { + this.files.clear(); + this.files.addAll(files); } } diff --git a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/internal/JReleaserModelConverter.java b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/internal/JReleaserModelConverter.java index dab38a0c..7a9fa521 100644 --- a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/internal/JReleaserModelConverter.java +++ b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/internal/JReleaserModelConverter.java @@ -604,6 +604,8 @@ public final class JReleaserModelConverter { a.setTemplateDirectory(nativeImage.getTemplateDirectory()); a.setGraal(convertArtifact(nativeImage.getGraal())); a.setMainJar(convertArtifact(nativeImage.getMainJar())); + a.setJars(convertGlobs(nativeImage.getJars())); + a.setFiles(convertGlobs(nativeImage.getFiles())); a.setArgs(nativeImage.getArgs()); return a; }