Subject: [bug#32295] [PATCH] gnu: clojure: Fix index generation

From: Alex ter Weele <[email-masked]>
Date: Sat, 28 Jul 2018 22:05:08 -0500

Gábor Boskovits <[email-masked]> writes:

> I could use some help from someone more familiar with clojure uses.
>
> On current master clojure does not build, as the manifest contains
> Class-Path: .
> and jar -i throws exception in phase 'generate-jar-indices.
>
> The patch I proposed removes the classpath from the manifest. Do you
> think this can interfere with normal uses of clojure?
>

Gábor,

I applied your patch and did the following:

$ guix environment guix -- make -j4 && ./pre-inst-env guix environment --ad-hoc icedtea clojure
...
$ java -jar $GUIX_ENVIRONMENT/share/java/clojure-1.9.0.jar
Clojure 1.9.0
user=> (inc 0)
1
user=> (clojure.set/difference #{1 2} #{1})
ClassNotFoundException clojure.set  java.net.URLClassLoader.findClass (URLClassLoader.java:381)
user=> (require 'clojure.set)
nil
user=> (clojure.set/difference #{1 2} #{1})
#{2}

Constructing the environment caused Clojures's test suite to run with no
failures. Based on a cursory test, I think that Clojure is working as
expected.

I also looked into what the removed line
means. https://ant.apache.org/manual/Tasks/jar.html explains that
<manifest> in the "jar" task specifies an inline
manifest. https://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#classpath
explains the meaning of a Class-Path in a manifest. So, I believe that
means that at runtime, JARs in the same directory as the Clojure JAR
will be available on the classpath.

I believe that the <attribute name="Class-Path" value="."/> line was
added in this commit
https://github.com/clojure/clojure/commit/36868a7734f15c51eb1831aa9d72a14544496987#diff-2cccd7bf48b7a9cc113ff564acd802a8R30. The
age of the commit and the commit message lead me to believe that it was
added as a convenience during the early development of Clojure and may
be removable upstream now. I may ask about that on the Clojure mailing
list.

> Another possible solution would be to delete the index generation
> phase, but I'm not sure about the implications here either.
>
> WDYT?

I also tried this and did the same as above. Clojure's test suite ran
again and had no failures. However, generate-jar-indices in (guix build
ant-build-system) has a docstring which suggests that the phase is
necessary to prevent garbage collection of the dependencies of the JAR
file. So it would seem like your patch is the best way to go ☺

P.S.: Gábor, thanks for your work on Java packages recently! With a
maven-build-system, I think I can bootstrap leiningen, which I'd really
like to see in the distribution.