Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate build system to gradle #107

Closed
kaklakariada opened this issue Oct 26, 2016 · 29 comments
Closed

Migrate build system to gradle #107

kaklakariada opened this issue Oct 26, 2016 · 29 comments
Assignees

Comments

@kaklakariada
Copy link
Contributor

kaklakariada commented Oct 26, 2016

I am willing to support the project by migrating the project by migrating the build system of the three sub-projects from ant to gradle and would like to know if your are interested in this.

Gradle is a build system for Java and other languages.

Advantages of gradle

  • Easy dependency management, no jars checked in to the repo
  • Netbeans supports gradle through a plugin
  • No prerequisites for developers (with gradle wrapper you don't need to install anything)
  • More potential developers as it is much easier to use other IDEs than netbeans

Proposed changes for the three sub-projects

  • Migrate build to gradle
    • Delivery packages for Windows, Linux and MacOS
    • Replace .sh scripts
  • Add gradle wrapper
  • Update TravisCI jobs
  • Documentation in README.md
    • Describe usage of the build system
    • Add getting started guide for developers
  • Cleanup
    • Restructure directories to comply with gradle conventions, e.g. move sources to src/main/java
    • Remove checked in jars
    • Remove netbeans specific config files that are unnecessary with gradle
    • Remove generated files from dist/ folder
    • Remove ant scripts and .sh scripts
    • Update .gitignore

Please let me know if these changes are interesting for you and if I should start working on this.

P.S.: Thank you very much for continuing the work on this great project!

@patzi
Copy link
Contributor

patzi commented Oct 26, 2016

Sounds great to me, had it on my mind as well to us gradle and get rid of the checked in jars. So from me you get a go. 👍

@criztovyl
Copy link
Contributor

Related: mediathekview/MLib#14

@Nicklas2751
Copy link
Member

@criztovyl criztovyl mentioned this issue Oct 27, 2016
3 tasks
@alex1702 alex1702 self-assigned this Oct 27, 2016
@bmarwell
Copy link

bmarwell commented Oct 28, 2016

Ich kann auf dem Hub nichts sehen.
Gerne kann ich auch beim Thema Maven-Plugin, Maven-Artefakte (maven central) etc. helfen.

Wenn man einige Interfaces erstellt und herausnimmt, wäre auch ein API-Modul möglich, was ich wirklich toll finden würde -- aber eines nach dem anderen.

Auf jeden fall sollten keine .project-Dateien mehr im Ordner sein, keine .jars, keine ant-Skripte etc., wie das etwa bei Hibiscus der Fall ist.

BTW: Eclipse is also supported, IntelliJ as well.

@alex1702
Copy link
Member

Auf dem Hub musst du dich vorher registrieren.

@bmarwell
Copy link

Schon klar. Schade, dass Github dafür nicht reicht. Postet ihr hier das Ergebnis?

@Nicklas2751
Copy link
Member

Nicklas2751 commented Oct 30, 2016

Die Mehrheit hat sich für gradle entschieden.

@criztovyl
Copy link
Contributor

Nur zur Bestätigung: Ist Grandle somit jetzt offiziell? :)

@alex1702
Copy link
Member

Jap

@kaklakariada kaklakariada changed the title Offering help: Migrate build system to gradle Migrate build system to gradle Nov 1, 2016
@lookshe
Copy link

lookshe commented Nov 3, 2016

Easy dependency management, no jars checked in to the repo

Das sehe ich als großen Nachteil, denn die zentralen Repositories halten nicht immer alles auf ewig vor. Ich bin in meinem Job als Softwareentwickler schon ziemlich oft über nicht mehr verfügbare Libraries gestoßen. Hier sollte entweder ein eigener Repository-Proxy gepflegt werden, oder die Libraries weiterhin eingecheckt und aus den entsprechenden Verzeichnissen verwendet werden. Nur so hat Software wirklich die Chance lange zu überleben und immer noch kompilierbar zu sein und somit auch mal schnell ein Fix eingebaut werden, selbst wenn es sonst jahrelang nicht notwendig war, etwas zu ändern und einige, oder alle, Abhängigkeiten nicht mehr aufgelöst werden können.

Bzgl. IDE-Support muss ich sagen, dass da eigentlich Maven im Java-Umfeld deutlich weiter verbreitet ist und auch Netbeans jetzt nicht gerade die verbreitetste IDE (http://www.baeldung.com/java-ides-2016). Wollte ich nur mal anmerken, soll keine Kritik sein.

PS: Keine Scripte mehr, aber Gradle-Wrapper-Skripte? Das ist jetzt auch ein kleiner Widerspruch in sich ;)

PPS: Nur weil Ant bei vielen heute nicht mehr State-of-the-Art ist, ist es doch ein zuverlässiges Werkzeug, wenn es ordentlich eingesetzt wurde. Unnötigerweise auf andere Systeme aufsetzen, wenn doch alles funktioniert, verursacht Arbeit, die hätte sinnvoller eingesetzt werden können.
Man sollte sich immer fragen, welchen Nutzen/Mehrwert eine Umstellung hat und aktuell ist keiner zu sehen, sondern eher das Problem, dass man jetzt auf externe Dienste angewiesen ist, damit man die Libraries laden kann.

@Nicklas2751
Copy link
Member

@lookshe Der Vorteil von maven und gradle ist u.a. dass keine lisb/dependencies mehr im git rumgammeln müssen. Allg. sind binarys im svn/git/etc. nicht sehr ratsam und sollten vermieden werden. Ant wie es aktuell verwendet wird läuft so nur unter linux (mac?). Weiterer Vorteil von gradle und maven also sie laufen auch unter Windows. Das dependencies aus dem zentralen maven Repo verschwunden sind habe ich bisher noch nicht erlebt und auch von Kollegen noch nie etwas gehört. Auch in der Arbeit wird stark auf maven gesetzt da die Vorteile beim bau komplexer Großprojekte stark überwiegen. Gegen Einrichtung eines eigenen Gradle Repo Proxys spricht aber nichts.

Btw. sollte doch mal eine dependencie verschwinden kann man die ja aus der letzten MediathekView version ziehen da die dependencies ja mit ins zip kommen da MV sonst ja garnicht gestartet werden kann. ;)

@derreisende77
Copy link
Contributor

Die von NetBeans erzeugten ant scripts laufen auch auf dem Mac. Aber die Mac Binaries baue ich aus diversen Gründen noch Teil automatisiert von Hand.
Ich bin aber auch kein Freund davon Binaries jedweder Form im git zu speichern - wenn sie automatisiert erzeugt werden.
Ansonsten hätte ich bisher mit maven dependencies nie Probleme. Verwende diese auch um MV mit IntelliJ zu bauen da ich in Teilen optimierter Bibliotheken verwende.

@lookshe
Copy link

lookshe commented Nov 4, 2016

Dann herzlichen Glückwunsch, wenn es bisher nicht passierte. Aber auch nicht vergessen, dass es meistens erst bemerkt wird, wenn man ein leeres lokales Repository hat und es Libraries sind, bei denen sich die Maintainer entscheiden es bspw. umzubenennen, in eigene Repos zu packen oder einfach löschen. Dann geht Jahre später auf einmal das Gesuche los, wenn man nicht einen Repository-Proxy hat.

Davon abgesehen würde mich mal eine wirklich triftige Begründung interessieren, warum Binaries in der Source-Verwaltung nicht ratsam sind. Gegenargument meinerseits: Egal wann, egal wo, ich checke das Projekt aus und kann es bauen. Keine externen Abhängigkeiten, die u.U. nicht aufgelöst werden können oder in den entsprechenden Versionen nicht mehr vorliegen und erstmal geschaut werden muss, welche denn nun genutzt werden muss, mit dem weiteren Nachteil, dass eine neue Version nicht mehr kompatibel sein kann, bzw. realistisch betrachtet erstmal ausgiebig getestet werden müsste, bevor sie verwendet werden sollte.

@bmarwell
Copy link

bmarwell commented Nov 4, 2016

Ich möchte auch nochmal sagen, dass das Argument von @lookshe kein wirkliches ist. Mir ist kein Fall bekannt, dass je eine Dependency aus Maven Central gelöscht wurde. Und dank Signaturen sind sie auch verifizierbar.

Davon abgesehen würde mich mal eine wirklich triftige Begründung interessieren, warum Binaries in der Source-Verwaltung nicht ratsam sind.

Ganz einfach: Es sind generierte Artefakte. In ein CVS gehören keine generierten Artefakte sondern nur "Bauanleitungen", wie man an diese kommt.

dass es meistens erst bemerkt wird, wenn man ein leeres lokales Repository hat

Stimmt auch nicht, da man mit TravisCI continuous Integration hat. Man merkt es also schon früher.

Gegenargument meinerseits: Egal wann, egal wo, ich checke das Projekt aus und kann es bauen.
Wenn du es ausscheckst, hast du Internet. Dann kannst Du auch an Maven Central heran und das Projekt bauen.

in den entsprechenden Versionen nicht mehr vorliegen und erstmal geschaut werden muss, welche denn nun genutzt werden muss, mit dem weiteren Nachteil, dass eine neue Version nicht mehr kompatibel sein kann

Symantic Versioning: Man kann jede beliebige Version einer Major-Version nutzen. Wenn eine 1.9.1 nicht verfügbar ist, geht auch eine 1.9.x und wahrscheinlich auch eine 1.8.x und in jedem Fall eine 1.10.x. - man muss ja nicht gleich auf eine 2.x.x-Version upgraden.

bzw. realistisch betrachtet erstmal ausgiebig getestet werden müsste

Ich schreibe gerne Unit-Tests bis zum Abwinken. Gerade Apache- und Google-Artefakte sind aber auch sehr gut getestet. Nicht nur auf richtiges, sondern auch auf gleichbleibendes Verhalten.

Travis CI kann automatisch zu anderen Tools, wie etwa codecov (Unit-Testing) und codacy (richtige Nutzung der Libraries) hochladen. Siehe mein FFB-Projekt: https://github.com/bmhm/ffb.depot.client. Es werden automatisch Unit-Tests ausgeführt.

Grade-Support gibt es auch bei IntelliJ und Eclipse ab Mars/Neon.

@lookshe
Copy link

lookshe commented Nov 4, 2016

Ich wollte eine triftige Begründung und keine Links, die immer nur das selbe wiederkäuen. Ich weiß sehr wohl über die Vorteile Bescheid, bin aber auch schon so oft auf die Schnauze geflogen, weil die Dependencies halt nicht noch Jahre später sauber vorhanden und gepflegt waren.

Und auch wenn gesagt wird, Löschen sei nicht erlaubt oder geht nicht, ich habe anderes erlebt. Es mag sein, dass das nicht aus dem Maven-Central gelöscht wurde (wobei ich dort schon Umbenennungen erlebt hatte), aber es wurde auf eine Pom im Maven-Central verwiesen, die wiederum auf andere Quellen verwies, sodass nichts mehr lief. Solange man es einmalig lokal gezogen hatte, fiel es nicht auf, erst wenn man das lokale Repository leert oder einen Rechner komplett neu aufsetzt. Und leider merkt man das nicht direkt bei der Verwendung, weil man einfach nur die Dependency reinpackt, aber nicht schaut, auf was das alles verweist und was wiederum deren Dependencies sind. Auch merkt man gern später erst, dass man auf einmal unterschiedliche Versionen der gleichen Library im Projekt hat, aus unterschiedlichen Dependencies, die sich dann auch noch beißen. Als Stichwort sei hier einfach mal Dependency-Hell genannt.

@bmarwell
Copy link

bmarwell commented Nov 4, 2016

weil die Dependencies halt nicht noch Jahre später sauber vorhanden und gepflegt waren

Ich denke, dass so ein lebendiges Projekt zwischendurch mal die Dependencies aktualisieren wird.

ich habe anderes erlebt

Aber nicht bei Maven Central. Da wir nur Maven Central nutzen, ist das irrelevant. Es kann aber sein, dass neue Artefaktversionen neue GroupIds bekommen. Aber da muss man ja eh die pom.xml anpassen.

die wiederum auf andere Quellen verwies

Das hat hier keiner vor: eine pom.xml mit parent einer fremd-pom.xml (bzw. bei Grade: Tief geschachtelte Module).

Rest s.o.

dass man auf einmal unterschiedliche Versionen der gleichen Library im Projekt hat. Als Stichwort sei hier einfach mal Dependency-Hell genannt.

Gerade da brilliert Maven. Den Tag dependencyManagement hast Du wohl leider noch nicht genutzt.

@bmarwell
Copy link

bmarwell commented Nov 4, 2016

Triftige Begründung siehe mein gleichzeitiger Kommentar vor deinem.

@Nicklas2751
Copy link
Member

Ich schließe dass hier, da die Diskussion zu sehr von der umstellung auf gradle abweicht die bereits in der Umsetzung ist. Wenn tatsächlich noch bedarf ist. Bitte entweder neues Issue oder Forum oder Hub oder aber ich denke hier ist nicht der richtige Ort dafür.

@lookshe
Copy link

lookshe commented Nov 4, 2016

Ganz einfach: Es sind generierte Artefakte.

Es sind keine generierten Artefakte, sondern die zum Bauen der Software notwendigen Libraries.

Symantic Versioning: Man kann jede beliebige Version einer Major-Version nutzen. Wenn eine 1.9.1 nicht verfügbar ist, geht auch eine 1.9.x und wahrscheinlich auch eine 1.8.x und in jedem Fall eine 1.10.x. - man muss ja nicht gleich auf eine 2.x.x-Version upgraden.

In der Theorie. Praktisch gibt es gern auch mal Inkompatibilitäten im Verhalten selbst bei Minor-Versionen.

Aber nicht bei Maven Central. Da wir nur Maven Central nutzen, ist das irrelevant. Es kann aber sein, dass neue Artefaktversionen neue GroupIds bekommen. Aber da muss man ja eh die pom.xml anpassen.

Schön, nur wird jcenter verwendet...

Das hat hier keiner vor: eine pom.xml mit parent einer fremd-pom.xml (bzw. bei Grade: Tief geschachtelte Module).

Noch nicht, aber man weiß nicht was kommt. Und darauf achtet nachher niemand mehr!

Ich denke, dass so ein lebendiges Projekt zwischendurch mal die Dependencies aktualisieren wird.

Gerade wenn es jahrelang ohne Probleme läuft und man diese nicht anpassen muss, fällt es erst spät auf. Nur weil es gerade etwas lebendiger ist, lässt das nicht auf die Zukunft schließen.

Gerade da brilliert Maven. Den Tag dependencyManagement hast Du wohl leider noch nicht genutzt.

Oft genug und schon oft genug geflucht, weil nämlich mit Exclusions gearbeitet werden musste, damit nicht die falschen Dependencies durch irgendwelche anderweitigen Abhängigkeiten reinkommen.

@lookshe
Copy link

lookshe commented Nov 4, 2016

Ich schließe dass hier, da die Diskussion zu sehr von der umstellung auf gradle abweicht die bereits in der Umsetzung ist. Wenn tatsächlich noch bedarf ist. Bitte entweder neues Issue oder Forum oder Hub oder aber ich denke hier ist nicht der richtige Ort dafür.

Ganz toll, ich habe nichts gegen Gradle, ich will nur verflucht nochmal die Software auch in einigen Jahren noch lauffähig haben und deswegen kann man sich nicht auf Drittanbieter und irgendwelche irgendwo gehosteten Libraries verlassen. Nur weil von den hier anwesenden, teilweise deutlich jüngeren Entwicklern, noch nie jemand über die genannten Probleme stolperte, heißt es nicht, dass diese nicht vorhanden sind.

Ich will einfach nur, dass entweder ein eigener Repository-Proxy verwendet wird, damit die verwendeten Libraries sichergestellt sind, oder diese eingecheckt sind und von dort verwendet werden. Beides widerspricht Gradle in keiner Weise und ist umsetzbar!

@alex1702
Copy link
Member

alex1702 commented Nov 4, 2016

Ich werde ein Repository-Proxy aufsetzen.
Edit: aufgesetzt wird Sonartype Nexus

@Nicklas2751
Copy link
Member

Nicklas2751 commented Nov 4, 2016

Die Software wird so oder so laufen da ja keine neuen versionen ausgeliefert werden wenn diese nicht bauen. Weder Travis tut das noch einer von uns. D.h. für den Anwender wirds weiter funktionieren und wenn bei uns eine tatsächlich fehlt gibts den proxy und zur not kann man das zip öffnen und die lib da raus kopieren und dann doch lokal einbinden solange das aber nicht der fall ist ist alles gut. ;)

@claell
Copy link

claell commented Nov 4, 2016

Verstehe das Schließen nicht ganz. Das läuft auf GitHub anders, als in einem Forum. Würde den Issue erst schließen, wenn Gradle auch eingebaut wurde.

@criztovyl
Copy link
Contributor

criztovyl commented Nov 6, 2016

@claell #107 Vertippt -.-

@claell
Copy link

claell commented Nov 8, 2016

What do you mean @criztovyl ?

@criztovyl
Copy link
Contributor

Huh, vertippt, meinte #132.

@claell
Copy link

claell commented Nov 9, 2016

Ah ok. War als ich den Kommentar geschrieben habe aber noch gar nicht gemerged, passt aber dann jetzt ja :)

@alex1702
Copy link
Member

alex1702 commented Nov 9, 2016

Tja du warst einfach zu früh :D

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

9 participants