diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..1d953f4b --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use nix diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ba0e1777..c4a1b5ac 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,6 +14,6 @@ jobs: with: name: fzakaria signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}' - - run: nix-build + - run: nix-build -A mvn2nix - run: ./result/bin/mvn2nix > dependencies.nix - run: nix-build -A buildMavenRepository --arg dependencies "import ./dependencies.nix" \ No newline at end of file diff --git a/.gitignore b/.gitignore index b4c2b674..1e131c06 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ target/ .idea/ *.iml result +.direnv/ diff --git a/README.md b/README.md index 81bb4380..4599bc3b 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,13 @@ $ nix run -f https://github.com/fzakaria/mvn2nix/archive/master.tar.gz --command If you have [cachix](https://cachix.org/) installed, you can leverage our prebuilt binary. > cachix use fzakaria +If your build builds only with **Java8** (the deafult is Java11); you can execute the alternative +*mvn2nix* attribute. + +```bash +$ nix run -f https://github.com/fzakaria/mvn2nix/archive/master.tar.gz mvn2nix-jdk8 --command mvn2nix +``` + ### Generating the Nix dependencies file In the same spirit of [bundix](https://github.com/nix-community/bundix), **mvn2nix** creates a Nix set with the diff --git a/default.nix b/default.nix index 0b170568..2620d11a 100644 --- a/default.nix +++ b/default.nix @@ -13,7 +13,9 @@ let ]; }; in { - mvn2nix = pkgs.mvn2nix; + mvn2nix = pkgs.mvn2nix-jdk11; + mvn2nix-jdk11 = pkgs.mvn2nix-jdk11; + mvn2nix-jdk8 = pkgs.mvn2nix-jdk8; buildMavenRepository = pkgs.buildMavenRepository; } diff --git a/derivation.nix b/derivation.nix index a9d18990..b8cf7e2d 100644 --- a/derivation.nix +++ b/derivation.nix @@ -1,10 +1,10 @@ -{ lib, stdenv, jdk, maven, makeWrapper, gitignoreSource }: +{ lib, stdenv, jdk, jdk11, maven, makeWrapper, gitignoreSource, maven-jdk11 }: with stdenv; let version = "0.1"; dependencies = mkDerivation { name = "mvn2nix-${version}-dependencies"; - buildInputs = [ jdk maven ]; + buildInputs = [ maven-jdk11 ]; src = gitignoreSource ./.; buildPhase = '' while mvn package -Dmaven.repo.local=$out/.m2 -Dmaven.wagon.rto=5000; [ $? = 1 ]; do @@ -28,7 +28,7 @@ in mkDerivation rec { inherit version; name = "${pname}-${version}"; src = gitignoreSource ./.; - buildInputs = [ jdk maven makeWrapper ]; + buildInputs = [ maven-jdk11 makeWrapper ]; buildPhase = '' # 'maven.repo.local' must be writable so copy it out of nix store mvn package --offline -Dmaven.repo.local=${dependencies}/.m2 @@ -48,7 +48,7 @@ in mkDerivation rec { # create a wrapper that will automatically set the classpath # this should be the paths from the dependency derivation - makeWrapper ${jdk}/bin/java $out/bin/${pname} \ + makeWrapper ${jdk11}/bin/java $out/bin/${pname} \ --add-flags "-jar $out/${name}.jar" \ --set M2_HOME ${maven} \ --set JAVA_HOME ${jdk} diff --git a/examples/mvn2nix/default.nix b/examples/mvn2nix/default.nix index 2d188fb0..9971c212 100644 --- a/examples/mvn2nix/default.nix +++ b/examples/mvn2nix/default.nix @@ -28,7 +28,7 @@ in mkDerivation rec { mkdir -p $out/bin # create a symbolic link for the lib directory - ln -s ${mavenRepository}/.m2 $out/lib + ln -s ${mavenRepository} $out/lib # copy out the JAR # Maven already setup the classpath to use m2 repository layout diff --git a/overlay.nix b/overlay.nix index 9269aa20..c7e83c90 100644 --- a/overlay.nix +++ b/overlay.nix @@ -1,7 +1,17 @@ self: super: { - jdk = super.jdk11_headless; + maven-jdk11 = super.maven.override { jdk = super.jdk11; }; - mvn2nix = self.callPackage ./derivation.nix { }; + maven-jdk8 = super.maven.override { jdk = super.jdk8; }; + + mvn2nix-jdk8 = self.callPackage ./derivation.nix { + jdk = super.jdk8; + maven = self.maven-jdk8; + }; + + mvn2nix-jdk11 = self.callPackage ./derivation.nix { + jdk = super.jdk11; + maven = self.maven-jdk11; + }; buildMavenRepository = self.callPackage ./maven.nix { }; } diff --git a/shell.nix b/shell.nix index 278eae3c..950d2ca7 100644 --- a/shell.nix +++ b/shell.nix @@ -16,5 +16,5 @@ let }; in pkgs.mkShell { name = "mvn2nix-shell"; - buildInputs = with pkgs; [ jdk11_headless maven gh-md-toc]; + buildInputs = with pkgs; [ jdk11_headless maven gh-md-toc ]; } diff --git a/src/main/java/com/fzakaria/mvn2nix/maven/Maven.java b/src/main/java/com/fzakaria/mvn2nix/maven/Maven.java index 02e167d1..8d4f0f0c 100644 --- a/src/main/java/com/fzakaria/mvn2nix/maven/Maven.java +++ b/src/main/java/com/fzakaria/mvn2nix/maven/Maven.java @@ -22,6 +22,7 @@ import java.nio.file.Path; import java.util.Arrays; import java.util.Collection; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -132,6 +133,8 @@ public Collection collectAllArtifactsInLocalRepository() { .filter(f -> !f.toFile().getName().equals("_remote.repositories")) .filter(f -> !f.toFile().getName().equals("resolver-status.properties")) .filter(f -> !f.toFile().getName().endsWith("lastUpdated")) + .filter(f -> !f.toFile().getName().endsWith("asc")) + .filter(f -> !f.toFile().getName().endsWith("unpacked")) .map(file -> { Path layout = localRepository.toPath().relativize(file); @@ -139,6 +142,15 @@ public Collection collectAllArtifactsInLocalRepository() { String nameAndVersionAndClassifier = com.google.common.io.Files.getNameWithoutExtension(layout.toFile().getName()); String version = layout.getParent().toFile().getName(); String name = layout.getParent().getParent().toFile().getName(); + + /* + * This is an easy safeguard to make sure we only capture correct artifacts regardless + * of the extension. The artifact must follow the pattern ${name}-${version} at the very least + */ + if (!(nameAndVersionAndClassifier.contains(name) && nameAndVersionAndClassifier.contains(version))) { + return null; + } + String classifier = nameAndVersionAndClassifier .replaceAll(name + "-" + version, "") .replaceFirst("^-", ""); @@ -154,7 +166,9 @@ public Collection collectAllArtifactsInLocalRepository() { .setVersion(version) .setExtension(extension) .build(); - }).collect(Collectors.toList()); + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); } catch (IOException e) { throw new UncheckedIOException(e); }