gradlew-maven

Dlaczego wolę Gradle od Mavena?

Gradle i Maven to obecnie dwa najpopularniejsze narzędzia do budowania projektów w Javie. Dają one nam bardzo dużo możliwości, a poprzez system pluginów możemy dowolnie dostosowywać je do naszych potrzeb. Dzisiaj skupię się na tym, w jaki sposób można wykorzystać te narzędzia przy rozwiązywaniu niestandardowych zadań.

Większość projektów w IT jest do siebie bardzo podobna albo w zasadzie nie wiele się między sobą różni. Jak można się domyśleć, proces budowania też jest bardzo podobny. Można go w skrócie opisać w kilku krokach: kopiowanie zasobów, kompilacja, odpalanie testów (jeśli takowe istnieją), robienie paczki. Oczywiście szczegóły mogą się różnić, ale główny przebieg pozostaje zawsze ten sam.

Dzięki takim narzędziom jak Gradle i Maven, proces ten stał się jeszcze bardziej u standaryzowany (odpowiednie struktury katalogów, wygodne parametryzowanie procesu budowania). Wcześniej najpopularniejszym narzędziem budowania był Ant. Pozwalał on na dużą dowolność, przez co każdy projekt mógł mieć inną strukturę katalogów i w zasadzie mógł być skonfigurowany bardzo dowolnie.

Jakie problemy chcemy rozwiązywać?

Oba te narzędzia dają nam w standardzie duże możliwości. Jednak czasem zachodzi potrzeba, zrobienia czegoś mniej standardowego np:

  • realizacji bardzo specyficznych wymagań klienta,
  • obejścia jakiegoś problemu np. buga lub jakiejś specyficznej konfiguracji,
  • zrobienie bardzo specyficznej konfiguracji dla środowiska.

I właśnie przy rozwiązywaniu takich niestandardowych zadań, widać ogromna różnica pomiędzy tymi narzędziami.

Oczywiście, ze wszystkimi powyższymi problemami można sobie poradzić używając różnych technik np. wykorzystując skrypty powłoki lub skrypty pisane np. w Pythonie opakowujące wywołanie Gradle’a, czy Mavena. W sytuacji, kiedy jesteśmy już w długo trwającym projekcie i mamy bardzo rozbudowane środowisko Ci/CD (Continues Integration/Continues Delivery), zmiana taka nie wchodzi w grę i pozostaje nam zmiana procesu budowania tylko w obrębie danego narzędzia.

Jak poradzić sobie z problemami używając Mavena?

Jeśli nie możemy znaleźć odpowiedniego plugina, który pozwoli nam rozwiązać dany problem. Mamy do dyspozycji kilka możliwość:

  1. Skorzystanie z plugina AntRun, który pozwala na używanie tasków Anta wewnątrz pliku konfiguracyjnego mavena (pom.xml).
    W kodzie xml, wygląda to mniej więcej tak:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-ant-run-plugin</artifactId>
      <version>1.8</version>
      <executions>
        <execution>
          <id>zip-artifacts</id>
          <phase>compile</phase>
          <goals>
            <goal>run</goal>
          </goals>
          <configuration>
            <target>
              <copy file="mySpecificFile.txt" todir="target/"/>
            </target>
          </configuration>
        </execution>
      </executions>
    </plugin>

    Wydaje się to dosyć proste, ale może okazać się skomplikowane, jeśli takich zadań musicie wykonać więcej. Największą wadą tego rozwiązania jest oczywiście sam xml.

  2. Napisanie własnego plugina do Mavena:
    Ta opcja jest bardziej czasochłonna i wymaga zapoznania się z api Mavena dla pluginów, a także stworzenia osobnego projektu dla tego plugina. Poza tym, dochodzi kwestia umieszczenia plugina w jakimś repozytorium, co jest dodatkowym krokiem (jeśli w twoim projekcie jest jakieś CI, to zwykle korzysta z wewnętrznego repozytorium artefaktów np. Nexus lub Artifactory). Niestety, cały proces może okazać się bardziej pracochłonny niż zadanie, które musimy zrealizować.

Jak poradzić sobie z problemami używając Gradle?

Gradle jest narzędziem, które bazuje na rozwiązaniach zawartych w Mavenie i Ancie. Podobnie jak w Mavenie, możemy poszukać istniejącego plugina. Jeśli się to nam nie uda, mamy też kilka innych możliwości:

  1. Napisanie własnego taska:
    Pliki konfiguracyjne Gradle są skryptami Grooviego. Każdy task to po prostu funkcja, która realizuje pewne zadanie. Groovy jest językiem bardzo javo-podobnym, więc większość javowców nie powinna mieć z nim problemów. Oczywiście warto tutaj zapoznać się z api Gradle, ale nie jest to konieczne.
    Przykładowy task:

    task copyMyFiles (type: Copy) {
        from 'src/main/java'
        into 'src/main/resources'
        doLast {
            print "Pliki zostały skopiowane"
        }
    }

    Mamy pełną dowolność i możemy zaprogramować tutaj wszystko, co chcemy.

  2. Napisanie dodatkowego skryptu, który dołączymy do głównego skryptu budującego. Zwykle taki skrypt umieszczany jest w katalogu gradle/ i dołączany do głównego skryptu budującego:
    apply from: 'gradle/myGradleScript.gradle'

    Tutaj też możemy umieścić w takim skrypcie, wszystko co jest nam potrzebne.

  3. Podobnie jak wyżej, mamy możliwość napisania skryptu, oraz umieszczenie go pod jakimś adresem url. Pozwala to współdzielić skrypty pomiędzy projektami.
    Skrypt dołączamy analogicznie jak wyżej, tym razem podając jego url:

    apply from: "http://example.com/myGradleScript.gradle
  4. Stworzenie własnego plugina, który umieścimy w kodzie projektu w katalogu buildSrc.
    Jeślim mam więcej zadań do wykonania, to warto zastanowić się nad dopisaniem własnego plugina. Pomoże to w uporządkowaniu kodu.
  5. Podobnie jak w Mavenie, mamy możliwość stworzenie plugina jako osobnego projektu i umieszczenie go w zdalnym repozytorium.
    Umieszczenie plugina w repozytorium daje nam możliwość współdzielenia go pomiędzy projektami i rozwijanie niezależnie od głównego projektu.

Podsumowanie

Jak widzisz Gradle daje nam o wiele więcej możliwości realizacji problematycznych zadań. Wszystkie te sposoby opierają się o wykorzystanie Grooviego i napisanie kawałka skryptu. Jest to o wiele bardziej naturalne podejście dla każdego programisty, niż konfigurowanie zadań w xmlu. Mam nadzieję, że chociaż trochę zachęciłem Cię do używania świetnego narzędzia, którym jest Gradle.

 

Źródła:

https://gradle.org
https://maven.apache.org

 

Mateusz Dąbrowski

Cześć jestem Mateusz, zajmuję się programowaniem już ponad 12 lat z czego ponad 8 programuję w Javie. Zapraszam Cię do lektury mojego bloga. Możesz przeczytać więcej o mnie >>TUTAJ<<