You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.3 KiB
76 lines
2.3 KiB
{ stdenv, maven, runCommand, writeText, fetchurl, lib, requireFile }: |
|
/* Takes an info file generated by mvn2nix |
|
* (https://github.com/NixOS/mvn2nix-maven-plugin) and builds the maven |
|
* project with it. |
|
* |
|
* repo: A local maven repository with the project's dependencies. |
|
* |
|
* settings: A settings.xml to pass to maven to use the repo. |
|
* |
|
* build: A simple build derivation that uses mvn compile and package to build |
|
* the project. |
|
*/ |
|
infoFile: let |
|
info = lib.importJSON infoFile; |
|
|
|
script = writeText "build-maven-repository.sh" '' |
|
${lib.concatStrings (map (dep: let |
|
inherit (dep) |
|
url sha1 groupId artifactId version |
|
authenticated metadata extension repository-id; |
|
|
|
versionDir = dep.unresolved-version or version; |
|
|
|
fetch = (if authenticated then requireFile else fetchurl) { |
|
inherit url sha1; |
|
}; |
|
|
|
fetchMetadata = (if authenticated then requireFile else fetchurl) { |
|
inherit (metadata) url sha1; |
|
}; |
|
in '' |
|
dir=$out/$(echo ${groupId} | sed 's|\.|/|g')/${artifactId}/${versionDir} |
|
mkdir -p $dir |
|
ln -sv ${fetch} $dir/${fetch.name} |
|
${lib.optionalString (dep ? metadata) '' |
|
ln -svf ${fetchMetadata} $dir/maven-metadata-${repository-id}.xml |
|
ln -sv ${fetch} $dir/$(echo ${fetch.name} | sed 's|${version}|${dep.unresolved-version}|') |
|
''} |
|
'') info.dependencies)} |
|
''; |
|
|
|
repo = runCommand "maven-repository" {} '' |
|
bash ${script} |
|
''; |
|
|
|
settings = writeText "settings.xml" '' |
|
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" |
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
|
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 |
|
http://maven.apache.org/xsd/settings-1.0.0.xsd"> |
|
<localRepository>${repo}</localRepository> |
|
</settings> |
|
''; |
|
|
|
src = dirOf infoFile; |
|
in { |
|
inherit repo settings info; |
|
|
|
build = stdenv.mkDerivation { |
|
name = "${info.project.artifactId}-${info.project.version}.jar"; |
|
|
|
src = builtins.filterSource (path: type: |
|
(toString path) != (toString (src + "/target")) && |
|
(toString path) != (toString (src + "/.git")) |
|
) src; |
|
|
|
buildInputs = [ maven ]; |
|
|
|
buildPhase = "mvn --offline --settings ${settings} compile"; |
|
|
|
installPhase = '' |
|
mvn --offline --settings ${settings} package |
|
mv target/*.jar $out |
|
''; |
|
}; |
|
}
|
|
|