summary refs log tree commit diff
path: root/gnu/packages/java.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/java.scm')
-rw-r--r--gnu/packages/java.scm1371
1 files changed, 1365 insertions, 6 deletions
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index 1d18a0b066..13e261438d 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016, 2017 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2017 Carlo Zancanaro <carlo@zancanaro.id.au>
+;;; Copyright © 2017 Julien Lepiller <julien@lepiller.eu>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -23,6 +24,7 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix hg-download)
   #:use-module (guix utils)
   #:use-module (guix build-system ant)
   #:use-module (guix build-system gnu)
@@ -287,14 +289,16 @@ designs.")
 (define-public ant
   (package
     (name "ant")
-    (version "1.9.6")
+    ;; The 1.9.x series is the last that can be built with GCJ.  The 1.10.x
+    ;; series requires Java 8.
+    (version "1.9.9")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://apache/ant/source/apache-ant-"
                                   version "-src.tar.gz"))
               (sha256
                (base32
-                "1396wflczyxjxl603dhxjvd559f289lha9y2f04f71c7hapjl3am"))))
+                "1k28mka0m3isy9yr8gz84kz1f3f879rwaxrd44vdn9xbfwvwk86n"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f ; no "check" target
@@ -1080,7 +1084,11 @@ an Ant task that extends the built-in @code{jar} task.")
     (build-system ant-build-system)
     (arguments
      `(#:tests? #f ; Tests require junit
+       #:modules ((guix build ant-build-system)
+                  (guix build utils)
+                  (srfi srfi-1))
        #:make-flags (list (string-append "-Dversion=" ,version))
+       #:test-target "unit-test"
        #:build-target "core"
        #:phases
        (modify-phases %standard-phases
@@ -1131,10 +1139,23 @@ private Method[] allMethods = getSortedMethods();")))))
              #t))
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
-             (install-file (string-append "build/hamcrest-core-"
-                                          ,version ".jar")
-                           (string-append (assoc-ref outputs "out")
-                                          "/share/java")))))))
+             (let* ((target (string-append (assoc-ref outputs "out")
+                                           "/share/java/"))
+                    (version-suffix ,(string-append "-" version ".jar"))
+                    (install-without-version-suffix
+                     (lambda (jar)
+                       (copy-file jar
+                                  (string-append target
+                                                 (basename jar version-suffix)
+                                                 ".jar")))))
+               (mkdir-p target)
+               (for-each
+                install-without-version-suffix
+                (find-files "build"
+                            (lambda (name _)
+                              (and (string-suffix? ".jar" name)
+                                   (not (string-suffix? "-sources.jar" name)))))))
+             #t)))))
     (native-inputs
      `(("java-qdox-1.12" ,java-qdox-1.12)
        ("java-jarjar" ,java-jarjar)))
@@ -1178,3 +1199,1341 @@ testing frameworks, mocking libraries and UI validation rules.")
 JUnit provides assertions for testing expected results, test fixtures for
 sharing common test data, and test runners for running tests.")
     (license license:epl1.0)))
+
+(define-public java-plexus-utils
+  (package
+    (name "java-plexus-utils")
+    (version "3.0.24")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/codehaus-plexus/"
+                                  "plexus-utils/archive/plexus-utils-"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "1mlwpc6fms24slygv5yvi6fi9hcha2fh0v73p5znpi78bg36i2js"))))
+    (build-system ant-build-system)
+    ;; FIXME: The default build.xml does not include a target to install
+    ;; javadoc files.
+    (arguments
+     `(#:jar-name "plexus-utils.jar"
+       #:source-dir "src/main"
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-reference-to-/bin-and-/usr
+           (lambda _
+             (substitute* "src/main/java/org/codehaus/plexus/util/\
+cli/shell/BourneShell.java"
+               (("/bin/sh") (which "sh"))
+               (("/usr/")   (getcwd)))
+             #t))
+         (add-after 'unpack 'fix-or-disable-broken-tests
+           (lambda _
+             (with-directory-excursion "src/test/java/org/codehaus/plexus/util"
+               (substitute* '("cli/CommandlineTest.java"
+                              "cli/shell/BourneShellTest.java")
+                 (("/bin/sh")   (which "sh"))
+                 (("/bin/echo") (which "echo")))
+
+               ;; This test depends on MavenProjectStub, but we don't have
+               ;; a package for Maven.
+               (delete-file "introspection/ReflectionValueExtractorTest.java")
+
+               ;; FIXME: The command line tests fail, maybe because they use
+               ;; absolute paths.
+               (delete-file "cli/CommandlineTest.java"))
+             #t)))))
+    (native-inputs
+     `(("java-junit" ,java-junit)))
+    (home-page "http://codehaus-plexus.github.io/plexus-utils/")
+    (synopsis "Common utilities for the Plexus framework")
+    (description "This package provides various Java utility classes for the
+Plexus framework to ease working with strings, files, command lines, XML and
+more.")
+    (license license:asl2.0)))
+
+(define-public java-plexus-interpolation
+  (package
+    (name "java-plexus-interpolation")
+    (version "1.23")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/codehaus-plexus/"
+                                  "plexus-interpolation/archive/"
+                                  "plexus-interpolation-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1w79ljwk42ymrgy8kqxq4l82pgdj6287gabpfnpkyzbrnclsnfrp"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:jar-name "plexus-interpolation.jar"
+       #:source-dir "src/main"))
+    (native-inputs
+     `(("java-junit" ,java-junit)
+       ("java-hamcrest-core" ,java-hamcrest-core)))
+    (home-page "http://codehaus-plexus.github.io/plexus-interpolation/")
+    (synopsis "Java components for interpolating ${} strings and the like")
+    (description "Plexus interpolator is a modular, flexible interpolation
+framework for the expression language style commonly seen in Maven, Plexus,
+and other related projects.
+
+It has its foundation in the @code{org.codehaus.plexus.utils.interpolation}
+package within @code{plexus-utils}, but has been separated in order to allow
+these two libraries to vary independently of one another.")
+    (license license:asl2.0)))
+
+(define-public java-asm
+  (package
+    (name "java-asm")
+    (version "5.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://download.forge.ow2.org/asm/"
+                                  "asm-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0kxvmv5275rnjl7jv0442k3wjnq03ngkb7sghs78avf45pzm4qgr"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:build-target "compile"
+       ;; The tests require an old version of Janino, which no longer compiles
+       ;; with the JDK7.
+       #:tests? #f
+       ;; We don't need these extra ant tasks, but the build system asks us to
+       ;; provide a path anyway.
+       #:make-flags (list (string-append "-Dobjectweb.ant.tasks.path=foo"))
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'install 'build-jars
+           (lambda* (#:key make-flags #:allow-other-keys)
+             ;; We cannot use the "jar" target because it depends on a couple
+             ;; of unpackaged, complicated tools.
+             (mkdir "dist")
+             (zero? (system* "jar"
+                             "-cf" (string-append "dist/asm-" ,version ".jar")
+                             "-C" "output/build/tmp" "."))))
+         (replace 'install
+           (install-jars "dist")))))
+    (native-inputs
+     `(("java-junit" ,java-junit)))
+    (home-page "http://asm.ow2.org/")
+    (synopsis "Very small and fast Java bytecode manipulation framework")
+    (description "ASM is an all purpose Java bytecode manipulation and
+analysis framework.  It can be used to modify existing classes or dynamically
+generate classes, directly in binary form.  The provided common
+transformations and analysis algorithms allow to easily assemble custom
+complex transformations and code analysis tools.")
+    (license license:bsd-3)))
+
+(define-public java-cglib
+  (package
+    (name "java-cglib")
+    (version "3.2.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://github.com/cglib/cglib/archive/RELEASE_"
+                    (string-map (lambda (c) (if (char=? c #\.) #\_ c)) version)
+                    ".tar.gz"))
+              (file-name (string-append "cglib-" version ".tar.gz"))
+              (sha256
+               (base32
+                "162dvd4fln76ai8prfharf66pn6r56p3sxx683j5vdyccrd5hi1q"))))
+    (build-system ant-build-system)
+    (arguments
+     `(;; FIXME: tests fail because junit runs
+       ;; "net.sf.cglib.transform.AbstractTransformTest", which does not seem
+       ;; to describe a test at all.
+       #:tests? #f
+       #:jar-name "cglib.jar"
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'chdir
+           (lambda _ (chdir "cglib") #t)))))
+    (inputs
+     `(("java-asm" ,java-asm)
+       ("java-junit" ,java-junit)))
+    (home-page "https://github.com/cglib/cglib/")
+    (synopsis "Java byte code generation library")
+    (description "The byte code generation library CGLIB is a high level API
+to generate and transform Java byte code.")
+    (license license:asl2.0)))
+
+(define-public java-objenesis
+  (package
+    (name "java-objenesis")
+    (version "2.5.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/easymock/objenesis/"
+                                  "archive/" version ".tar.gz"))
+              (file-name (string-append "objenesis-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1va5qz1i2wawwavhnxfzxnfgrcaflz9p1pg03irrjh4nd3rz8wh6"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:jar-name "objenesis.jar"
+       #:source-dir "main/src/"
+       #:test-dir "main/src/test/"))
+    (native-inputs
+     `(("java-junit" ,java-junit)
+       ("java-hamcrest-core" ,java-hamcrest-core)))
+    (home-page "http://objenesis.org/")
+    (synopsis "Bypass the constructor when creating an object")
+    (description "Objenesis is a small Java library that serves one purpose:
+to instantiate a new object of a particular class.  It is common to see
+restrictions in libraries stating that classes must require a default
+constructor.  Objenesis aims to overcome these restrictions by bypassing the
+constructor on object instantiation.")
+    (license license:asl2.0)))
+
+(define-public java-easymock
+  (package
+    (name "java-easymock")
+    (version "3.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/easymock/easymock/"
+                                  "archive/easymock-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1yzg0kv256ndr57gpav46cyv4a1ns5sj722l50zpxk3j6sk9hnmi"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:jar-name "easymock.jar"
+       #:source-dir "core/src/main"
+       #:test-dir "core/src/test"
+       #:phases
+       (modify-phases %standard-phases
+         ;; FIXME: Android support requires the following packages to be
+         ;; available: com.google.dexmaker.stock.ProxyBuilder
+         (add-after 'unpack 'delete-android-support
+           (lambda _
+             (with-directory-excursion "core/src/main/java/org/easymock/internal"
+               (substitute* "MocksControl.java"
+                 (("AndroidSupport.isAndroid\\(\\)") "false")
+                 (("return classProxyFactory = new AndroidClassProxyFactory\\(\\);") ""))
+               (delete-file "AndroidClassProxyFactory.java"))
+             #t))
+         (add-after 'unpack 'delete-broken-tests
+           (lambda _
+             (with-directory-excursion "core/src/test/java/org/easymock"
+               ;; This test depends on dexmaker.
+               (delete-file "tests2/ClassExtensionHelperTest.java")
+
+               ;; This is not a test.
+               (delete-file "tests/BaseEasyMockRunnerTest.java")
+
+               ;; This test should be executed with a different runner...
+               (delete-file "tests2/EasyMockAnnotationsTest.java")
+               ;; ...but deleting it means that we also have to delete these
+               ;; dependent files.
+               (delete-file "tests2/EasyMockRunnerTest.java")
+               (delete-file "tests2/EasyMockRuleTest.java")
+
+               ;; This test fails because the file "easymock.properties" does
+               ;; not exist.
+               (delete-file "tests2/EasyMockPropertiesTest.java"))
+             #t)))))
+    (inputs
+     `(("java-asm" ,java-asm)
+       ("java-cglib" ,java-cglib)
+       ("java-objenesis" ,java-objenesis)))
+    (native-inputs
+     `(("java-junit" ,java-junit)
+       ("java-hamcrest-core" ,java-hamcrest-core)))
+    (home-page "http://easymock.org")
+    (synopsis "Java library providing mock objects for unit tests")
+    (description "EasyMock is a Java library that provides an easy way to use
+mock objects in unit testing.")
+    (license license:asl2.0)))
+
+(define-public java-jmock-1
+  (package
+    (name "java-jmock")
+    (version "1.2.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/jmock-developers/"
+                                  "jmock-library/archive/" version ".tar.gz"))
+              (file-name (string-append "jmock-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0xmrlhq0fszldkbv281k9463mv496143vvmqwpxp62yzjvdkx9w0"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:build-target "jars"
+       #:test-target "run.tests"
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'install (install-jars "build")))))
+    (home-page "http://www.jmock.org")
+    (synopsis "Mock object library for test-driven development")
+    (description "JMock is a library that supports test-driven development of
+Java code with mock objects.  Mock objects help you design and test the
+interactions between the objects in your programs.
+
+The jMock library
+
+@itemize
+@item makes it quick and easy to define mock objects
+@item lets you precisely specify the interactions between
+  your objects, reducing the brittleness of your tests
+@item plugs into your favourite test framework
+@item is easy to extend.
+@end itemize\n")
+    (license license:bsd-3)))
+
+(define-public java-hamcrest-all
+  (package (inherit java-hamcrest-core)
+    (name "java-hamcrest-all")
+    (arguments
+     (substitute-keyword-arguments (package-arguments java-hamcrest-core)
+       ;; FIXME: a unit test fails because org.hamcrest.SelfDescribing is not
+       ;; found, although it is part of the hamcrest-core library that has
+       ;; just been built.
+       ;;
+       ;; Fixing this one test is insufficient, though, and upstream confirmed
+       ;; that the latest hamcrest release fails its unit tests when built
+       ;; with Java 7.  See https://github.com/hamcrest/JavaHamcrest/issues/30
+       ((#:tests? _) #f)
+       ((#:build-target _) "bigjar")
+       ((#:phases phases)
+        `(modify-phases ,phases
+           ;; Some build targets override the classpath, so we need to patch
+           ;; the build.xml to ensure that required dependencies are on the
+           ;; classpath.
+           (add-after 'unpack 'patch-classpath-for-integration
+             (lambda* (#:key inputs #:allow-other-keys)
+               (substitute* "build.xml"
+                 ((" build/hamcrest-library-\\$\\{version\\}.jar" line)
+                  (string-join
+                   (cons line
+                         (append
+                          (find-files (assoc-ref inputs "java-hamcrest-core") "\\.jar$")
+                          (find-files (assoc-ref inputs "java-junit") "\\.jar$")
+                          (find-files (assoc-ref inputs "java-jmock") "\\.jar$")
+                          (find-files (assoc-ref inputs "java-easymock") "\\.jar$")))
+                   ";")))
+               #t))))))
+    (inputs
+     `(("java-junit" ,java-junit)
+       ("java-jmock" ,java-jmock-1)
+       ("java-easymock" ,java-easymock)
+       ("java-hamcrest-core" ,java-hamcrest-core)
+       ,@(package-inputs java-hamcrest-core)))))
+
+(define-public java-jopt-simple
+  (package
+    (name "java-jopt-simple")
+    (version "5.0.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://repo1.maven.org/maven2/"
+                                  "net/sf/jopt-simple/jopt-simple/"
+                                  version "/jopt-simple-"
+                                  version "-sources.jar"))
+              (sha256
+               (base32
+                "1v8bzmwmw6qq20gm42xyay6vrd567dra4vqwhgjnqqjz1gs9f8qa"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:tests? #f ; there are no tests
+       #:jar-name "jopt-simple.jar"))
+    (home-page "https://pholser.github.io/jopt-simple/")
+    (synopsis "Java library for parsing command line options")
+    (description "JOpt Simple is a Java library for parsing command line
+options, such as those you might pass to an invocation of @code{javac}.  In
+the interest of striving for simplicity, as closely as possible JOpt Simple
+attempts to honor the command line option syntaxes of POSIX @code{getopt} and
+GNU @code{getopt_long}.  It also aims to make option parser configuration and
+retrieval of options and their arguments simple and expressive, without being
+overly clever.")
+    (license license:expat)))
+
+(define-public java-commons-math3
+  (package
+    (name "java-commons-math3")
+    (version "3.6.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://apache/commons/math/source/"
+                                  "commons-math3-" version "-src.tar.gz"))
+              (sha256
+               (base32
+                "19l6yp44qc5g7wg816nbn5z3zq3xxzwimvbm4a8pczgvpi4i85s6"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:build-target "jar"
+       #:test-target "test"
+       #:make-flags
+       (let ((hamcrest (assoc-ref %build-inputs "java-hamcrest-core"))
+             (junit    (assoc-ref %build-inputs "java-junit")))
+         (list (string-append "-Djunit.jar=" junit "/share/java/junit.jar")
+               (string-append "-Dhamcrest.jar=" hamcrest
+                              "/share/java/hamcrest-core.jar")))
+       #:phases
+       (modify-phases %standard-phases
+         ;; We want to build the jar in the build phase and run the tests
+         ;; later in a separate phase.
+         (add-after 'unpack 'untangle-targets
+           (lambda _
+             (substitute* "build.xml"
+               (("name=\"jar\" depends=\"test\"")
+                "name=\"jar\" depends=\"compile\""))
+             #t))
+         ;; There is no install target.
+         (replace 'install
+           (install-jars "target")))))
+    (native-inputs
+     `(("java-junit" ,java-junit)
+       ("java-hamcrest-core" ,java-hamcrest-core)))
+    (home-page "http://commons.apache.org/math/")
+    (synopsis "Apache Commons mathematics library")
+    (description "Commons Math is a library of lightweight, self-contained
+mathematics and statistics components addressing the most common problems not
+available in the Java programming language or Commons Lang.")
+    (license license:asl2.0)))
+
+(define-public java-jmh
+  (package
+    (name "java-jmh")
+    (version "1.17.5")
+    (source (origin
+              (method hg-fetch)
+              (uri (hg-reference
+                    (url "http://hg.openjdk.java.net/code-tools/jmh/")
+                    (changeset version)))
+              (file-name (string-append name "-" version "-checkout"))
+              (sha256
+               (base32
+                "1fxyxhg9famwcg1prc4cgwb5wzyxqavn3cjm5vz8605xz7x5k084"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:jar-name "jmh-core.jar"
+       #:source-dir "jmh-core/src/main"
+       #:test-dir "jmh-core/src/test"
+       #:phases
+       (modify-phases %standard-phases
+         ;; This seems to be a bug in the JDK.  It may not be necessary in
+         ;; future versions of the JDK.
+         (add-after 'unpack 'fix-bug
+           (lambda _
+             (with-directory-excursion
+                 "jmh-core/src/main/java/org/openjdk/jmh/runner/options"
+               (substitute* '("IntegerValueConverter.java"
+                              "ThreadsValueConverter.java")
+                 (("public Class<Integer> valueType")
+                  "public Class<? extends Integer> valueType")))
+             #t)))))
+    (inputs
+     `(("java-jopt-simple" ,java-jopt-simple)
+       ("java-commons-math3" ,java-commons-math3)))
+    (native-inputs
+     `(("java-junit" ,java-junit)
+       ("java-hamcrest-core" ,java-hamcrest-core)))
+    (home-page "http://openjdk.java.net/projects/code-tools/jmh/")
+    (synopsis "Benchmark harness for the JVM")
+    (description "JMH is a Java harness for building, running, and analysing
+nano/micro/milli/macro benchmarks written in Java and other languages
+targetting the JVM.")
+    ;; GPLv2 only
+    (license license:gpl2)))
+
+(define-public java-commons-collections4
+  (package
+    (name "java-commons-collections4")
+    (version "4.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://apache/commons/collections/source/"
+                                  "commons-collections4-" version "-src.tar.gz"))
+              (sha256
+               (base32
+                "1krfhvggympq4avk7gh6qafzf6b9ip6r1m4lmacikyx04039m0wl"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:test-target "test"
+       #:make-flags
+       (let ((hamcrest (assoc-ref %build-inputs "java-hamcrest-core"))
+             (junit    (assoc-ref %build-inputs "java-junit"))
+             (easymock (assoc-ref %build-inputs "java-easymock")))
+         (list (string-append "-Djunit.jar=" junit "/share/java/junit.jar")
+               (string-append "-Dhamcrest.jar=" hamcrest
+                              "/share/java/hamcrest-core.jar")
+               (string-append "-Deasymock.jar=" easymock
+                              "/share/java/easymock.jar")))
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'install
+           (install-jars "target")))))
+    (native-inputs
+     `(("java-junit" ,java-junit)
+       ("java-hamcrest-core" ,java-hamcrest-core)
+       ("java-easymock" ,java-easymock)))
+    (home-page "http://commons.apache.org/collections/")
+    (synopsis "Collections framework")
+    (description "The Java Collections Framework is the recognised standard
+for collection handling in Java.  Commons-Collections seek to build upon the
+JDK classes by providing new interfaces, implementations and utilities.  There
+are many features, including:
+
+@itemize
+@item @code{Bag} interface for collections that have a number of copies of
+  each object
+@item @code{BidiMap} interface for maps that can be looked up from value to
+  key as well and key to value
+@item @code{MapIterator} interface to provide simple and quick iteration over
+  maps
+@item Transforming decorators that alter each object as it is added to the
+  collection
+@item Composite collections that make multiple collections look like one
+@item Ordered maps and sets that retain the order elements are added in,
+  including an LRU based map
+@item Reference map that allows keys and/or values to be garbage collected
+  under close control
+@item Many comparator implementations
+@item Many iterator implementations
+@item Adapter classes from array and enumerations to collections
+@item Utilities to test or create typical set-theory properties of collections
+  such as union, intersection, and closure.
+@end itemize\n")
+    (license license:asl2.0)))
+
+(define-public java-commons-io
+  (package
+    (name "java-commons-io")
+    (version "2.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://apache/commons/io/source/"
+                           "commons-io-" version "-src.tar.gz"))
+       (sha256
+        (base32
+         "0q5y41jrcjvx9hzs47x5kdhnasdy6rm4bzqd2jxl02w717m7a7v3"))))
+    (build-system ant-build-system)
+    (outputs '("out" "doc"))
+    (arguments
+     `(#:test-target "test"
+       #:make-flags
+       (list (string-append "-Djunit.jar="
+                            (assoc-ref %build-inputs "java-junit")
+                            "/share/java/junit.jar"))
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'build 'build-javadoc ant-build-javadoc)
+         (replace 'install (install-jars "target"))
+         (add-after 'install 'install-doc (install-javadoc "target/apidocs")))))
+    (native-inputs
+     `(("java-junit" ,java-junit)
+       ("java-hamcrest-core" ,java-hamcrest-core)))
+    (home-page "http://commons.apache.org/io/")
+    (synopsis "Common useful IO related classes")
+    (description "Commons-IO contains utility classes, stream implementations,
+file filters and endian classes.")
+    (license license:asl2.0)))
+
+(define-public java-commons-lang
+  (package
+    (name "java-commons-lang")
+    (version "2.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://apache/commons/lang/source/"
+                           "commons-lang-" version "-src.tar.gz"))
+       (sha256
+        (base32 "1mxwagqadzx1b2al7i0z1v0r235aj2njdyijf02szq0vhmqrfiq5"))))
+    (build-system ant-build-system)
+    (outputs '("out" "doc"))
+    (arguments
+     `(#:test-target "test"
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'build 'build-javadoc ant-build-javadoc)
+         (add-before 'check 'disable-failing-test
+           (lambda _
+             ;; Disable a failing test
+             (substitute* "src/test/java/org/apache/commons/lang/\
+time/FastDateFormatTest.java"
+               (("public void testFormat\\(\\)")
+                "public void disabled_testFormat()"))
+             #t))
+         (replace 'install (install-jars "target"))
+         (add-after 'install 'install-doc (install-javadoc "target/apidocs")))))
+    (native-inputs
+     `(("java-junit" ,java-junit)))
+    (home-page "http://commons.apache.org/lang/")
+    (synopsis "Extension of the java.lang package")
+    (description "The Commons Lang components contains a set of Java classes
+that provide helper methods for standard Java classes, especially those found
+in the @code{java.lang} package in the Sun JDK.  The following classes are
+included:
+
+@itemize
+@item StringUtils - Helper for @code{java.lang.String}.
+@item CharSetUtils - Methods for dealing with @code{CharSets}, which are sets
+  of characters such as @code{[a-z]} and @code{[abcdez]}.
+@item RandomStringUtils - Helper for creating randomised strings.
+@item NumberUtils - Helper for @code{java.lang.Number} and its subclasses.
+@item NumberRange - A range of numbers with an upper and lower bound.
+@item ObjectUtils - Helper for @code{java.lang.Object}.
+@item SerializationUtils - Helper for serializing objects.
+@item SystemUtils - Utility class defining the Java system properties.
+@item NestedException package - A sub-package for the creation of nested
+  exceptions.
+@item Enum package - A sub-package for the creation of enumerated types.
+@item Builder package - A sub-package for the creation of @code{equals},
+  @code{hashCode}, @code{compareTo} and @code{toString} methods.
+@end itemize\n")
+    (license license:asl2.0)))
+
+(define-public java-commons-lang3
+  (package
+    (name "java-commons-lang3")
+    (version "3.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://apache/commons/lang/source/"
+                           "commons-lang3-" version "-src.tar.gz"))
+       (sha256
+        (base32 "0xpshb9spjhplq5a7mr0y1bgfw8190ik4xj8f569xidfcki1d6kg"))))
+    (build-system ant-build-system)
+    (outputs '("out" "doc"))
+    (arguments
+     `(#:test-target "test"
+       #:make-flags
+       (let ((hamcrest (assoc-ref %build-inputs "java-hamcrest-all"))
+             (junit    (assoc-ref %build-inputs "java-junit"))
+             (easymock (assoc-ref %build-inputs "java-easymock"))
+             (io       (assoc-ref %build-inputs "java-commons-io")))
+         (list (string-append "-Djunit.jar=" junit "/share/java/junit.jar")
+               (string-append "-Dhamcrest.jar=" hamcrest
+                              "/share/java/hamcrest-all.jar")
+               (string-append "-Dcommons-io.jar=" io
+                              "/share/java/commons-io-"
+                              ,(package-version java-commons-io)
+                              "-SNAPSHOT.jar")
+               (string-append "-Deasymock.jar=" easymock
+                              "/share/java/easymock.jar")))
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'build 'build-javadoc ant-build-javadoc)
+         (replace 'install (install-jars "target"))
+         (add-after 'install 'install-doc (install-javadoc "target/apidocs")))))
+    (native-inputs
+     `(("java-junit" ,java-junit)
+       ("java-commons-io" ,java-commons-io)
+       ("java-hamcrest-all" ,java-hamcrest-all)
+       ("java-easymock" ,java-easymock)))
+    (home-page "http://commons.apache.org/lang/")
+    (synopsis "Extension of the java.lang package")
+    (description "The Commons Lang components contains a set of Java classes
+that provide helper methods for standard Java classes, especially those found
+in the @code{java.lang} package.  The following classes are included:
+
+@itemize
+@item StringUtils - Helper for @code{java.lang.String}.
+@item CharSetUtils - Methods for dealing with @code{CharSets}, which are sets of
+  characters such as @code{[a-z]} and @code{[abcdez]}.
+@item RandomStringUtils - Helper for creating randomised strings.
+@item NumberUtils - Helper for @code{java.lang.Number} and its subclasses.
+@item NumberRange - A range of numbers with an upper and lower bound.
+@item ObjectUtils - Helper for @code{java.lang.Object}.
+@item SerializationUtils - Helper for serializing objects.
+@item SystemUtils - Utility class defining the Java system properties.
+@item NestedException package - A sub-package for the creation of nested
+   exceptions.
+@item Enum package - A sub-package for the creation of enumerated types.
+@item Builder package - A sub-package for the creation of @code{equals},
+  @code{hashCode}, @code{compareTo} and @code{toString} methods.
+@end itemize\n")
+    (license license:asl2.0)))
+
+(define-public java-jsr305
+  (package
+    (name "java-jsr305")
+    (version "3.0.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://repo1.maven.org/maven2/"
+                                  "com/google/code/findbugs/"
+                                  "jsr305/" version "/jsr305-"
+                                  version "-sources.jar"))
+              (sha256
+               (base32
+                "1rh6jin9v7jqpq3kf1swl868l8i94r636n03pzpsmgr8v0lh9j2n"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:tests? #f ; no tests included
+       #:jar-name "jsr305.jar"))
+    (home-page "http://findbugs.sourceforge.net/")
+    (synopsis "Annotations for the static analyzer called findbugs")
+    (description "This package provides annotations for the findbugs package.
+It provides packages in the @code{javax.annotations} namespace.")
+    (license license:asl2.0)))
+
+(define-public java-guava
+  (package
+    (name "java-guava")
+    ;; This is the last release of Guava that can be built with Java 7.
+    (version "20.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/google/guava/"
+                                  "releases/download/v" version
+                                  "/guava-" version "-sources.jar"))
+              (sha256
+               (base32
+                "1gawrs5gi6j5hcfxdgpnfli75vb9pfi4sn09pnc8xacr669yajwr"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:tests? #f                      ; no tests included
+       #:jar-name "guava.jar"
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'trim-sources
+           (lambda _
+             (with-directory-excursion "src/com/google/common"
+               ;; Remove annotations to avoid extra dependencies:
+               ;; * "j2objc" annotations are used when converting Java to
+               ;;   Objective C;
+               ;; * "errorprone" annotations catch common Java mistakes at
+               ;;   compile time;
+               ;; * "IgnoreJRERequirement" is used for Android.
+               (substitute* (find-files "." "\\.java$")
+                 (("import com.google.j2objc.*") "")
+                 (("import com.google.errorprone.annotation.*") "")
+                 (("import org.codehaus.mojo.animal_sniffer.*") "")
+                 (("@CanIgnoreReturnValue") "")
+                 (("@LazyInit") "")
+                 (("@WeakOuter") "")
+                 (("@RetainedWith") "")
+                 (("@Weak") "")
+                 (("@ForOverride") "")
+                 (("@J2ObjCIncompatible") "")
+                 (("@IgnoreJRERequirement") "")))
+             #t)))))
+    (inputs
+     `(("java-jsr305" ,java-jsr305)))
+    (home-page "https://github.com/google/guava")
+    (synopsis "Google core libraries for Java")
+    (description "Guava is a set of core libraries that includes new
+collection types (such as multimap and multiset), immutable collections, a
+graph library, functional types, an in-memory cache, and APIs/utilities for
+concurrency, I/O, hashing, primitives, reflection, string processing, and much
+more!")
+    (license license:asl2.0)))
+
+;; The java-commons-logging package provides adapters to many different
+;; logging frameworks.  To avoid an excessive dependency graph we try to build
+;; it with only a minimal set of adapters.
+(define-public java-commons-logging-minimal
+  (package
+    (name "java-commons-logging-minimal")
+    (version "1.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://apache/commons/logging/source/"
+                                  "commons-logging-" version "-src.tar.gz"))
+              (sha256
+               (base32
+                "10bwcy5w8d7y39n0krlwhnp8ds3kj5zhmzj0zxnkw0qdlsjmsrj9"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:tests? #f ; avoid dependency on logging frameworks
+       #:jar-name "commons-logging-minimal.jar"
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'delete-adapters-and-tests
+           (lambda _
+             ;; Delete all adapters except for NoOpLog, SimpleLog, and
+             ;; LogFactoryImpl.  NoOpLog is required to build; LogFactoryImpl
+             ;; is used by applications; SimpleLog is the only actually usable
+             ;; implementation that does not depend on another logging
+             ;; framework.
+             (for-each
+              (lambda (file)
+                (delete-file (string-append
+                              "src/main/java/org/apache/commons/logging/impl/" file)))
+              (list "Jdk13LumberjackLogger.java"
+                    "WeakHashtable.java"
+                    "Log4JLogger.java"
+                    "ServletContextCleaner.java"
+                    "Jdk14Logger.java"
+                    "AvalonLogger.java"
+                    "LogKitLogger.java"))
+             (delete-file-recursively "src/test")
+             #t)))))
+    (home-page "http://commons.apache.org/logging/")
+    (synopsis "Common API for logging implementations")
+    (description "The Logging package is a thin bridge between different
+logging implementations.  A library that uses the commons-logging API can be
+used with any logging implementation at runtime.")
+    (license license:asl2.0)))
+
+(define-public java-commons-cli
+  (package
+    (name "java-commons-cli")
+    (version "1.3.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://apache/commons/cli/source/"
+                                  "commons-cli-" version "-src.tar.gz"))
+              (sha256
+               (base32
+                "1fkjn552i12vp3xxk21ws4p70fi0lyjm004vzxsdaz7gdpgyxxyl"))))
+    (build-system ant-build-system)
+    ;; TODO: javadoc
+    (arguments
+     `(#:jar-name "commons-cli.jar"))
+    (native-inputs
+     `(("java-junit" ,java-junit)
+       ("java-hamcrest-core" ,java-hamcrest-core)))
+    (home-page "http://commons.apache.org/cli/")
+    (synopsis "Command line arguments and options parsing library")
+    (description "The Apache Commons CLI library provides an API for parsing
+command line options passed to programs.  It is also able to print help
+messages detailing the options available for a command line tool.
+
+Commons CLI supports different types of options:
+
+@itemize
+@item POSIX like options (ie. tar -zxvf foo.tar.gz)
+@item GNU like long options (ie. du --human-readable --max-depth=1)
+@item Java like properties (ie. java -Djava.awt.headless=true Foo)
+@item Short options with value attached (ie. gcc -O2 foo.c)
+@item long options with single hyphen (ie. ant -projecthelp)
+@end itemize
+
+This is a part of the Apache Commons Project.")
+    (license license:asl2.0)))
+
+(define-public java-commons-codec
+  (package
+    (name "java-commons-codec")
+    (version "1.10")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://apache/commons/codec/source/"
+                                  "commons-codec-" version "-src.tar.gz"))
+              (sha256
+               (base32
+                "1w9qg30y4s0x8gnmr2fgj4lyplfn788jqxbcz27lf5kbr6n8xr65"))))
+    (build-system ant-build-system)
+    (outputs '("out" "doc"))
+    (arguments
+     `(#:test-target "test"
+       #:make-flags
+       (let ((hamcrest (assoc-ref %build-inputs "java-hamcrest-core"))
+             (junit    (assoc-ref %build-inputs "java-junit")))
+         (list (string-append "-Djunit.jar=" junit "/share/java/junit.jar")
+               (string-append "-Dhamcrest.jar=" hamcrest
+                              "/share/java/hamcrest-core.jar")
+               ;; Do not append version to jar.
+               "-Dfinal.name=commons-codec"))
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'build 'build-javadoc ant-build-javadoc)
+         (replace 'install (install-jars "dist"))
+         (add-after 'install 'install-doc (install-javadoc "dist/docs/api")))))
+    (native-inputs
+     `(("java-junit" ,java-junit)
+       ("java-hamcrest-core" ,java-hamcrest-core)))
+    (home-page "http://commons.apache.org/codec/")
+    (synopsis "Common encoders and decoders such as Base64, Hex, Phonetic and URLs")
+    (description "The codec package contains simple encoder and decoders for
+various formats such as Base64 and Hexadecimal.  In addition to these widely
+used encoders and decoders, the codec package also maintains a collection of
+phonetic encoding utilities.
+
+This is a part of the Apache Commons Project.")
+    (license license:asl2.0)))
+
+(define-public java-commons-daemon
+  (package
+    (name "java-commons-daemon")
+    (version "1.0.15")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://apache/commons/daemon/source/"
+                                  "commons-daemon-" version "-src.tar.gz"))
+              (sha256
+               (base32
+                "0ci46kq8jpz084ccwq0mmkahcgsmh20ziclp2jf5i0djqv95gvhi"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:test-target "test"
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'build 'build-javadoc ant-build-javadoc)
+         (replace 'install (install-jars "dist"))
+         (add-after 'install 'install-doc (install-javadoc "dist/docs/api")))))
+    (native-inputs
+     `(("java-junit" ,java-junit)))
+    (home-page "http://commons.apache.org/daemon/")
+    (synopsis "Library to launch Java applications as daemons")
+    (description "The Daemon package from Apache Commons can be used to
+implement Java applications which can be launched as daemons.  For example the
+program will be notified about a shutdown so that it can perform cleanup tasks
+before its process of execution is destroyed by the operation system.
+
+This package contains the Java library.  You will also need the actual binary
+for your architecture which is provided by the jsvc package.
+
+This is a part of the Apache Commons Project.")
+    (license license:asl2.0)))
+
+(define-public antlr2
+  (package
+    (name "antlr2")
+    (version "2.7.7")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://www.antlr2.org/download/antlr-"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "1ffvcwdw73id0dk6pj2mlxjvbg0662qacx4ylayqcxgg381fnfl5"))
+              (modules '((guix build utils)))
+              (snippet
+               '(begin
+                  (delete-file "antlr.jar")
+                  (substitute* "lib/cpp/antlr/CharScanner.hpp"
+                    (("#include <map>")
+                     (string-append
+                       "#include <map>\n"
+                       "#define EOF (-1)\n"
+                       "#include <strings.h>")))
+                  (substitute* "configure"
+                    (("/bin/sh") "sh"))))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'strip-jar-timestamps
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (jar1 (string-append out "/lib/antlr.jar"))
+                    (jar2 (string-append out "/share/antlr-2.7.7/antlr.jar")))
+               ;; XXX: copied from (guix build ant-build-system)
+               (define (strip-jar jar dir)
+                 (let ((manifest (string-append dir "/META-INF/MANIFEST.MF")))
+                   (mkdir-p dir)
+                   (and (with-directory-excursion dir
+                          (zero? (system* "jar" "xf" jar)))
+                        (delete-file jar)
+                        (for-each (lambda (file)
+                                    (let ((s (lstat file)))
+                                      (unless (eq? (stat:type s) 'symlink)
+                                                 (utime file 0 0 0 0))))
+                                  (find-files dir #:directories? #t))
+                        (with-directory-excursion dir
+                          (let* ((files (find-files "." ".*" #:directories? #t)))
+                            (unless (zero? (apply system*
+                                                  `("zip" "-X" ,jar ,manifest
+                                                    ,@files)))
+                              (error "'zip' failed"))))
+                        (utime jar 0 0)
+                        #t)))
+                (strip-jar jar1 "temp1")
+                (strip-jar jar2 "temp2"))))
+         (add-after 'configure 'fix-bin-ls
+           (lambda _
+             (for-each (lambda (file)
+                         (substitute* file
+                          (("/bin/ls") "ls")))
+               (find-files "." "Makefile")))))))
+    (native-inputs
+     `(("which" ,which)
+       ("zip" ,zip)
+       ("java" ,icedtea "jdk")))
+    (inputs
+     `(("java" ,icedtea)))
+    (home-page "http://www.antlr2.org")
+    (synopsis "Framework for constructing recognizers, compilers, and translators")
+    (description "ANTLR, ANother Tool for Language Recognition, (formerly PCCTS)
+is a language tool that provides a framework for constructing recognizers,
+compilers, and translators from grammatical descriptions containing Java, C#,
+C++, or Python actions.  ANTLR provides excellent support for tree construction,
+tree walking, and translation.")
+    (license license:public-domain)))
+
+(define-public stringtemplate3
+  (package
+    (name "stringtemplate3")
+    (version "3.2.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/antlr/website-st4/raw/"
+                                  "gh-pages/download/stringtemplate-"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "086yj68np1vqhkj7483diz3km6s6y4gmwqswa7524a0ca6vxn2is"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:jar-name "stringtemplate-3.2.1.jar"
+       #:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'generate-grammar
+           (lambda _
+             (let ((dir "src/org/antlr/stringtemplate/language/"))
+               (for-each (lambda (file)
+                           (display file)
+                           (newline)
+                           (system* "antlr" "-o" dir (string-append dir file)))
+                         '("template.g" "angle.bracket.template.g" "action.g"
+                           "eval.g" "group.g" "interface.g"))))))))
+    (native-inputs
+     `(("antlr" ,antlr2)))
+    (home-page "http://www.stringtemplate.org")
+    (synopsis "Template engine to generate formatted text output")
+    (description "StringTemplate is a java template engine (with ports for C#,
+Objective-C, JavaScript, Scala) for generating source code, web pages, emails,
+or any other formatted text output.  StringTemplate is particularly good at
+code generators, multiple site skins, and internationalization / localization.
+StringTemplate also powers ANTLR.")
+    (license license:bsd-3)))
+
+;; antlr3 is partially written using antlr3 grammar files. It also depends on
+;; ST4 (stringtemplate4), which is also partially written using antlr3 grammar
+;; files and uses antlr3 at runtime. The latest version requires a recent version
+;; of antlr3 at runtime.
+;; Fortunately, ST4 4.0.6 can be built with an older antlr3, and we use antlr3.3.
+;; This version of ST4 is sufficient for the latest antlr3.
+;; We use ST4 4.0.6 to build a boostrap antlr3 (latest version), and build
+;; the latest ST4 with it. Then we build our final antlr3 that will be linked
+;; against the latest ST4.
+;; antlr3.3 still depends on antlr3 to generate some files, so we use an
+;; even older version, antlr3.1, to generate them. Fortunately antlr3.1 uses
+;; only grammar files with the antlr2 syntax.
+;; So we build antlr3.1 -> antlr3.3 -> ST4.0.6 -> antlr3-bootstrap -> ST4 -> antlr3.
+
+(define-public stringtemplate4
+  (package
+    (name "stringtemplate4")
+    (version "4.0.8")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/antlr/stringtemplate4/archive/"
+                                  version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1pri8hqa95rfdkjy55icl5q1m09zwp5k67ib14abas39s4v3w087"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:tests? #f
+       #:jar-name (string-append ,name "-" ,version ".jar")
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'generate-grammar
+           (lambda* (#:key inputs #:allow-other-keys)
+             (chdir "src/org/stringtemplate/v4/compiler/")
+             (for-each (lambda (file)
+                         (display file)
+                         (newline)
+                         (system* "antlr3" file))
+                       '("STParser.g" "Group.g" "CodeGenerator.g"))
+             (chdir "../../../../.."))))))
+    (inputs
+     `(("antlr3" ,antlr3-bootstrap)
+       ("antlr2" ,antlr2)
+       ("stringtemplate" ,stringtemplate3)))
+    (home-page "http://www.stringtemplate.org")
+    (synopsis "Template engine to generate formatted text output")
+    (description "StringTemplate is a java template engine (with ports for C#,
+Objective-C, JavaScript, Scala) for generating source code, web pages, emails,
+or any other formatted text output.  StringTemplate is particularly good at
+code generators, multiple site skins, and internationalization / localization.
+StringTemplate also powers ANTLR.")
+    (license license:bsd-3)))
+
+(define stringtemplate4-4.0.6
+  (package
+    (inherit stringtemplate4)
+    (name "stringtemplate4")
+    (version "4.0.6")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/antlr/stringtemplate4/archive/ST-"
+                                  version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0hjmh1ahdsh3w825i67mli9l4nncc4l6hdbf9ma91jvlj590sljp"))))
+    (inputs
+     `(("antlr3" ,antlr3-3.3)
+       ("antlr2" ,antlr2)
+       ("stringtemplate" ,stringtemplate3)))))
+
+(define-public antlr3
+  (package
+    (name "antlr3")
+    (version "3.5.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/antlr/antlr3/archive/"
+                                  version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "07zff5frmjd53rnqdx31h0pmswz1lv0p2lp28cspfszh25ysz6sj"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:jar-name (string-append ,name "-" ,version ".jar")
+       #:source-dir "tool/src/main/java:runtime/Java/src/main/java:tool/src/main/antlr3"
+       #:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'bin-install
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let ((jar (string-append (assoc-ref outputs "out") "/share/java"))
+                   (bin (string-append (assoc-ref outputs "out") "/bin")))
+               (mkdir-p bin)
+               (with-output-to-file (string-append bin "/antlr3")
+                 (lambda _
+                   (display
+                     (string-append "#!" (which "sh") "\n"
+                                    "java -cp " jar "/" ,name "-" ,version ".jar:"
+                                    (string-concatenate
+                                      (find-files (assoc-ref inputs "stringtemplate")
+                                                  ".*\\.jar"))
+                                    ":"
+                                    (string-concatenate
+                                      (find-files (assoc-ref inputs "stringtemplate4")
+                                                  ".*\\.jar"))
+                                    ":"
+                                    (string-concatenate
+                                      (find-files (string-append
+                                                    (assoc-ref inputs "antlr")
+                                                    "/lib")
+                                                  ".*\\.jar"))
+                                    " org.antlr.Tool $*"))))
+               (chmod (string-append bin "/antlr3") #o755))))
+         (add-before 'build 'generate-grammar
+           (lambda _
+             (chdir "tool/src/main/antlr3/org/antlr/grammar/v3/")
+             (for-each (lambda (file)
+                         (display file)
+                         (newline)
+                         (system* "antlr3" file))
+                       '("ANTLR.g" "ANTLRTreePrinter.g" "ActionAnalysis.g"
+                         "AssignTokenTypesWalker.g"
+                         "ActionTranslator.g" "TreeToNFAConverter.g"
+                         "ANTLRv3.g" "ANTLRv3Tree.g" "LeftRecursiveRuleWalker.g"
+                         "CodeGenTreeWalker.g" "DefineGrammarItemsWalker.g"))
+             (substitute* "ANTLRParser.java"
+               (("public Object getTree") "public GrammarAST getTree"))
+             (substitute* "ANTLRv3Parser.java"
+               (("public Object getTree") "public CommonTree getTree"))
+             (chdir "../../../../../java")
+             (system* "antlr" "-o" "org/antlr/tool"
+                      "org/antlr/tool/serialize.g")
+             (substitute* "org/antlr/tool/LeftRecursiveRuleAnalyzer.java"
+               (("import org.antlr.grammar.v3.\\*;") "import org.antlr.grammar.v3.*;
+import org.antlr.grammar.v3.ANTLRTreePrinter;"))
+             (substitute* "org/antlr/tool/ErrorManager.java"
+               (("case NO_SUCH_ATTRIBUTE_PASS_THROUGH:") ""))
+             (chdir "../../../..")))
+         (add-before 'build 'fix-build-xml
+           (lambda _
+             (substitute* "build.xml"
+               (("<exec") "<copy todir=\"${classes.dir}\">
+<fileset dir=\"tool/src/main/resources\">
+<include name=\"**/*.stg\"/>
+<include name=\"**/*.st\"/>
+<include name=\"**/*.sti\"/>
+<include name=\"**/STLexer.tokens\"/>
+</fileset>
+</copy><exec")))))))
+    (native-inputs
+     `(("antlr" ,antlr2)
+       ("antlr3" ,antlr3-bootstrap)))
+    (inputs
+     `(("junit" ,java-junit)
+       ("stringtemplate" ,stringtemplate3)
+       ("stringtemplate4" ,stringtemplate4)))
+    (propagated-inputs
+     `(("stringtemplate" ,stringtemplate3)
+       ("antlr" ,antlr2)
+       ("stringtemplate4" ,stringtemplate4-4.0.6)))
+    (home-page "http://www.antlr3.org")
+    (synopsis "Framework for constructing recognizers, compilers, and translators")
+    (description "ANTLR, ANother Tool for Language Recognition, (formerly PCCTS)
+is a language tool that provides a framework for constructing recognizers,
+compilers, and translators from grammatical descriptions containing Java, C#,
+C++, or Python actions.  ANTLR provides excellent support for tree construction,
+tree walking, and translation.")
+    (license license:bsd-3)))
+
+(define antlr3-bootstrap
+  (package
+    (inherit antlr3)
+    (name "antlr3-bootstrap")
+    (native-inputs
+     `(("antlr" ,antlr2)
+       ("antlr3" ,antlr3-3.3)))
+    (inputs
+     `(("junit" ,java-junit)))))
+
+(define antlr3-3.3
+  (package
+    (inherit antlr3)
+    (name "antlr3")
+    (version "3.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/antlr/website-antlr3/raw/"
+                                  "gh-pages/download/antlr-"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "0qgg5vgsm4l1d6dj9pfbaa25dpv2ry2gny8ajy4vvgvfklw97b3m"))))
+    (arguments
+     `(#:jar-name (string-append ,name "-" ,version ".jar")
+       #:source-dir (string-append "tool/src/main/java:runtime/Java/src/main/java:"
+                                "tool/src/main/antlr2:tool/src/main/antlr3")
+       #:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'bin-install
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let ((jar (string-append (assoc-ref outputs "out") "/share/java"))
+                   (bin (string-append (assoc-ref outputs "out") "/bin")))
+               (mkdir-p bin)
+               (with-output-to-file (string-append bin "/antlr3")
+                 (lambda _
+                   (display
+                     (string-append "#!" (which "sh") "\n"
+                                    "java -cp " jar "/antlr3-3.3.jar:"
+                                    (string-concatenate
+                                      (find-files (assoc-ref inputs "stringtemplate")
+                                                  ".*\\.jar"))
+                                    ":"
+                                    (string-concatenate
+                                      (find-files (string-append
+                                                    (assoc-ref inputs "antlr")
+                                                    "/lib")
+                                                  ".*\\.jar"))
+                                    " org.antlr.Tool $*"))))
+               (chmod (string-append bin "/antlr3") #o755))))
+         (add-before 'build 'generate-grammar
+           (lambda _
+             (let ((dir "tool/src/main/antlr2/org/antlr/grammar/v2/"))
+               (for-each (lambda (file)
+                           (display file)
+                           (newline)
+                           (system* "antlr" "-o" dir (string-append dir file)))
+                         '("antlr.g" "antlr.print.g" "assign.types.g"
+                           "buildnfa.g" "codegen.g" "define.g")))
+             (chdir "tool/src/main/antlr3/org/antlr/grammar/v3/")
+             (for-each (lambda (file)
+                         (display file)
+                         (newline)
+                         (system* "antlr3" file))
+                       '("ActionAnalysis.g" "ActionTranslator.g" "ANTLRv3.g"
+                         "ANTLRv3Tree.g"))
+             (chdir "../../../../../../../..")
+             (substitute* "tool/src/main/java/org/antlr/tool/Grammar.java"
+               (("import org.antlr.grammar.v2.\\*;")
+                "import org.antlr.grammar.v2.*;\n
+import org.antlr.grammar.v2.TreeToNFAConverter;\n
+import org.antlr.grammar.v2.DefineGrammarItemsWalker;\n
+import org.antlr.grammar.v2.ANTLRTreePrinter;"))))
+         (add-before 'build 'fix-build-xml
+           (lambda _
+             (substitute* "build.xml"
+               (("<exec") "<copy todir=\"${classes.dir}\">
+<fileset dir=\"tool/src/main/resources\">
+<include name=\"**/*.stg\"/>
+<include name=\"**/*.st\"/>
+<include name=\"**/*.sti\"/>
+<include name=\"**/STLexer.tokens\"/>
+</fileset>
+</copy><exec")))))))
+    (native-inputs
+     `(("antlr" ,antlr2)
+       ("antlr3" ,antlr3-3.1)))
+    (inputs
+     `(("junit" ,java-junit)))
+    (propagated-inputs
+     `(("stringtemplate" ,stringtemplate3)
+       ("antlr" ,antlr2)
+       ("antlr3" ,antlr3-3.1)))))
+
+(define antlr3-3.1
+  (package
+    (inherit antlr3)
+    (name "antlr3-3.1")
+    (version "3.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/antlr/website-antlr3/raw/"
+                                  "gh-pages/download/antlr-"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "0sfimc9cpbgrihz4giyygc8afgpma2c93yqpwb951giriri6x66z"))))
+    (arguments
+     `(#:jar-name (string-append ,name "-" ,version ".jar")
+       #:source-dir "src:runtime/Java/src"
+       #:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'bin-install
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let ((jar (string-append (assoc-ref outputs "out") "/share/java"))
+                   (bin (string-append (assoc-ref outputs "out") "/bin")))
+               (mkdir-p bin)
+               (with-output-to-file (string-append bin "/antlr3")
+                 (lambda _
+                   (display
+                     (string-append "#!" (which "sh") "\n"
+                                    "java -cp " jar "/antlr3-3.1-3.1.jar:"
+                                    (string-concatenate
+                                      (find-files (assoc-ref inputs "stringtemplate")
+                                                  ".*\\.jar"))
+                                    ":"
+                                    (string-concatenate
+                                      (find-files (string-append
+                                                    (assoc-ref inputs "antlr")
+                                                    "/lib")
+                                                  ".*\\.jar"))
+                                    " org.antlr.Tool $*"))))
+               (chmod (string-append bin "/antlr3") #o755))))
+         (add-before 'build 'generate-grammar
+           (lambda _
+             (let ((dir "src/org/antlr/tool/"))
+               (for-each (lambda (file)
+                           (display file)
+                           (newline)
+                           (system* "antlr" "-o" dir (string-append dir file)))
+                         '("antlr.g" "antlr.print.g" "assign.types.g"
+                           "buildnfa.g" "define.g")))
+             (format #t "codegen.g\n")
+             (system* "antlr" "-o" "src/org/antlr/codegen"
+                      "src/org/antlr/codegen/codegen.g")))
+         (add-before 'build 'fix-build-xml
+           (lambda _
+             (substitute* "build.xml"
+               (("<exec") "<copy todir=\"${classes.dir}\">
+<fileset dir=\"src\">
+<include name=\"**/*.stg\"/>
+<include name=\"**/*.st\"/>
+<include name=\"**/*.sti\"/>
+<include name=\"**/STLexer.tokens\"/>
+</fileset>
+</copy><exec")))))))
+    (native-inputs
+     `(("antlr" ,antlr2)))
+    (inputs
+     `(("junit" ,java-junit)))
+    (propagated-inputs
+     `(("stringtemplate" ,stringtemplate3)))))