nixpkgs/pkgs/build-support/build-maven.nix

82 lines
2.5 KiB
Nix
Raw Normal View History

2015-07-08 11:24:55 +01:00
{ stdenv, maven, runCommand, writeText, fetchurl, lib, requireFile }:
2015-06-22 03:24:03 +01:00
/* Takes an info file generated by mvn2nix
2015-07-01 13:11:05 +01:00
* (https://github.com/NixOS/mvn2nix-maven-plugin) and builds the maven
2015-06-22 03:24:03 +01:00
* 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
2016-02-29 13:49:29 +00:00
info = lib.importJSON infoFile;
2015-06-22 03:24:03 +01:00
script = writeText "build-maven-repository.sh" ''
2015-06-22 03:24:03 +01:00
${lib.concatStrings (map (dep: let
inherit (dep) sha1 groupId artifactId version metadata repository-id;
versionDir = dep.unresolved-version or version;
authenticated = dep.authenticated or false;
url = dep.url or "";
2015-06-22 03:24:03 +01:00
fetch = if (url != "") then ((if authenticated then requireFile else fetchurl) {
2015-07-08 11:24:55 +01:00
inherit url sha1;
}) else "";
fetchMetadata = (if authenticated then requireFile else fetchurl) {
inherit (metadata) url sha1;
};
2015-06-22 03:24:03 +01:00
in ''
dir=$out/$(echo ${groupId} | sed 's|\.|/|g')/${artifactId}/${versionDir}
2015-06-22 03:24:03 +01:00
mkdir -p $dir
${lib.optionalString (fetch != "") ''
ln -sv ${fetch} $dir/${fetch.name}
''}
${lib.optionalString (dep ? metadata) ''
ln -svf ${fetchMetadata} $dir/maven-metadata-${repository-id}.xml
${lib.optionalString (fetch != "") ''
ln -sv ${fetch} $dir/$(echo ${fetch.name} | sed 's|${version}|${dep.unresolved-version}|')
''}
''}
2015-06-22 03:24:03 +01:00
'') info.dependencies)}
'';
repo = runCommand "maven-repository" {} ''
bash ${script}
'';
2015-06-22 03:24:03 +01:00
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 {
2015-07-14 10:58:54 +01:00
inherit repo settings info;
2015-06-22 03:24:03 +01:00
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
'';
};
}