[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Guidance for packaging Java programs
From: |
Julien Lepiller |
Subject: |
Re: Guidance for packaging Java programs |
Date: |
Thu, 13 Jul 2023 19:48:59 +0200 |
User-agent: |
K-9 Mail for Android |
Hi Bruno,
I'm glad to see some interest in Java :)
First, Java has its own build systems, somewhat like autotools/cmake/meson etc.
In the past, ant was the most popular. It's somewhat similar to Make, as you
specify build targets in a build.xml file. This case is well supported and we
have a ant-build-system for that.
The first difficulty is that ant is-just like make, so it won't manage
dependencies, and even not specify any. In the Java world, they either use the
same solution as C, in that they don't care and it's your job to bring in
dependencies until the build stops breaking (although it might sound bad, this
is the good way of doing things for us), or they ship the binary of their
dependencies and force you to use that. This is bad for us, since we want to
build everything fsom source. It's just a bit more work, but nothing we can
patch or snippet away usually.
Nowadays, ant is loosing "market share" in favor of Maven and Gradle. We have a
working though probably too primitive maven-build-system which can build a
maven project as long as you provide dependencies and plugins.
They are both also package managers, so they usually specify dependencies,
which could be useful for an importer, but they often lack source information
and there's a lot of bloat in these files (many unneeded dependencies stay
there forever…).
Gradle is similar to Maven but it requires quite a lot of work still. The main
issue is that it requires Kotlin, the programming language. Since Guix tries to
bootstrap its compilers, we need a bootstrap of Kotlin. I tried to do that and
after a lot of pain, managed to cleanly bootstrap a kotlin-1.0. I still need to
work on adding more to the chain and get more recent versions, but that's pure
crazyness at this point.
BiglyBT doesn't seem to have too mazy dependencies at first glance, maybe a
better target, though it still requires some cleanup. Not sure what swt is, but
we would need to build it ourselves.
Jing looks like it can use ant, but it also looks like it has a ton of
lependencies. You could get lost in a rabbithole packaging that one :)
I've never seen anything like saxon-he sources. It looks like a bunch of zip
files that contain java files with no build system. The ant-build-system might
be able to build that, though no idea how much dependencies there could be.
I'd also like to get Mindustry at some point, but I don't see that happening
any time soon : it uses gradle, and with custom plugins too, which means we
can't even cheat and use something other than gradle :/
If you feel like helping, maybe an importer would be a good first step :). You
should be able to get info from Maven Central (get the pom files, they are XML
files and we have a module somewhere to handle them (guix build maven pom) I
think). It should work for maven and gradle packages at least. Mapping maven
name to guix names might also be challenging, but we can solve with an
upstream-name property.
Here are some more resources if you want to learn more about Guix and Java:
I gave a talk about bootstrapping Maven in 2020:
https://xana.lepiller.eu/guix-days-2020/guix-days-2020-julien-lepiller-bootstrapping-maven-480.mp4
There's also my Kotlin bootstrap chain:
https://framagit.org/tyreunom/guix-android/-/blob/master/android/packages/kotlin.scm
There's also a bootstrap of sbt (Scala Build Tool) from Scala, but Scala is not
bootstrapped/able in that repo.
To summarize, the main pain points are: lots of dependencies that can quickly
go out of hand, source buildability is not great, as many ship their own
versions of their dependencies (we need to snippet pre-built jars away, and
find a workaround when the build fails to find them), and bootstrappability, as
there can be quite a lot of dependency circles.
HTH, and don't hesitate if you want to learn more!
Le 13 juillet 2023 19:00:07 GMT+02:00, Bruno Victal <mirai@makinata.eu> a écrit
:
>Hi all,
>
>I'm interested in seeing BiglyBT (an awesome BitTorrent client) [1],
>jing (a RELAX NG validator) [2], Saxon-HE (a free implementation of
>XSLT 2.0 + 3.0) [3] and Mindustry (an addicting tower-defense
>game) [4] packaged for Guix and I'd like to ask for some guidance
>with this subject.
>
>Though I'm not familiar with the language, this seldomly reveals to
>be a problem if the project uses GNU Autotools, Meson, CMake, etc.
>but I'm completely lost when it comes to Java. It's hard to understand
>what's happening, what are the dependencies, how the whole thing is
>assembled together or if I'm even staring at something supposed to be
>built at all. The lack of importers doesn't help either :(
>
>The impression I get is that overall the Guix Java subsystem/support
>seems to be quite barren which I suspect is in part due to the
>rather arcane build process involved. (the manual doesn't have much
>information on the topic as well)
>
>Does anyone have any insight in what would it take to get the
>aforementioned applications properly packaged in Guix? (i.e. without
>repackaging the binary from upstream)
>I'd also be grateful if someone could point me to a primer on
>“how to go from a (java) source checkout into a built app that can
>be used”.
>
>
>[1]: <https://github.com/BiglySoftware/BiglyBT>
>[2]: <https://github.com/relaxng/jing-trang>
>[3]: <https://github.com/Saxonica/Saxon-HE/>
>[4]: <https://mindustrygame.github.io/>
>