Cum se instaleaza Apache Maven pe Fedora 44?

Configurare noua (How To)

Situatie

Instalati Apache Maven pe Fedora 44 cu pachetul DNF pentru actualizari gestionate de Fedora, sau cu tarball-ul oficial cand un proiect necesita o versiune Maven 3 mai noua sub /opt. Fluxul de lucru include verificari Java, un build de test quickstart, actualizari manuale sau prin helper pentru tarball, curatarea cache-ului, configurarea proxy si eliminare.

Alegerea metodei de instalare Maven

Metoda Sursa sau canalul Comportament actualizari Potrivit pentru Compromisuri
Pachet DNF Pachetul Fedora maven Actualizat cu upgrade-uri DNF normale Majority workstation-uri, servere si hosturi CI Fedora Poate ramane in urma versiunii Maven 3 recomandate de Apache
Tarball oficial Apache Maven downloads Actualizare manuala verificata sau helper optional update-maven Cea mai noua versiune upstream Maven 3 sau versiuni fixate de proiect Necesita configurarea PATH si gestionare manuala a ciclului de viata

Reimprospatarea Fedora inainte de instalarea Maven

Reimprospatati metadatele repository-ului si aplicati actualizarile de pachete in asteptare inainte de a instala Maven:

sudo dnf upgrade --refresh

Solutie

Pasi de urmat

Metoda 1: Instalarea Apache Maven cu DNF

Instalati Maven din repository-urile implicite Fedora:

sudo dnf install maven

Fedora rezolva dependentele Java ale Maven in timpul tranzactiei. Pe metadatele pachetelor Fedora 44, pachetul Maven foloseste binding-ul maven-openjdk25 si instaleaza java-25-openjdk-devel cand JDK-ul corespunzator nu este deja prezent.

Confirmati RPM-urile instalate cand doriti dovada la nivel de pachet:

rpm -q maven maven-openjdk25 java-25-openjdk-devel

Exemplu de output Fedora 44:

maven-3.9.11-11.fc44.noarch
maven-openjdk25-3.9.11-11.fc44.noarch
java-25-openjdk-devel-25.0.3.0.9-2.fc44.x86_64

Verificati binarul Maven activ si runtime-ul Java:

mvn -version

Maven home trebuie sa pointeze catre locatia ambalata de Fedora:

Apache Maven 3.9.11 (Red Hat 3.9.11-11)
Maven home: /usr/share/maven
Java version: 25.0.3, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-25-openjdk
Default locale: en_AU, platform encoding: UTF-8
OS name: "linux", version: "7.0.6-200.fc44.x86_64", arch: "amd64", family: "unix"

Metoda 2: Instalarea Apache Maven din tarball-ul oficial

Metoda tarball instaleaza Maven sub /opt si foloseste fisierul de checksum Apache pentru a verifica arhiva descarcata inainte de extractie.

ATENTIE: Nu instalati ambele metode cu exceptia cazului in care intentionati sa aveti un Maven ambalat sub /usr/bin si un Maven gestionat manual sub /opt. Comanda care castiga depinde de ordinea din $PATH.

Instalarea Java si a instrumentelor de download pentru Maven

Instalati pachetul de dezvoltare OpenJDK si instrumentele de download necesare fluxului de lucru tarball:

sudo dnf install java-25-openjdk-devel curl tar gzip

NOTA: Maven 3.9 ruleaza pe JDK 8 sau mai nou, dar un JDK complet ramane alegerea practica pentru hosturile de build Fedora deoarece proiectele Maven necesita adesea javac, jar si instrumente de dezvoltare aferente.

Detectarea versiunii curente Apache Maven 3

Folositi pagina de download Maven a Apache ca sursa de versiune si extrageti versiunea curenta a tarball-ului binar Maven 3:

bash
MAVEN_VERSION=
MAVEN_PAGE=
if cd /tmp; then
  MAVEN_PAGE=$(curl -fsSL https://maven.apache.org/download.cgi)
  MAVEN_VERSION=$(printf '%s\n' "$MAVEN_PAGE" | grep -oE 'apache-maven-3\.[0-9.]+-bin\.tar\.gz' | sed -E 's/apache-maven-([0-9.]+)-bin\.tar\.gz/\1/' | sort -Vu | tail -n 1)
fi

if [ -n "$MAVEN_VERSION" ]; then
  printf 'Maven version: %s\n' "$MAVEN_VERSION"
else
  echo "Could not detect the current Maven 3 release." >&2
fi

Continuati doar dupa ce comanda afiseaza o versiune, deoarece pasii de download reutilizeaza aceeasi variabila in aceeasi sesiune de terminal.

Descarcarea si verificarea tarball-ului Maven

Descarcati arhiva binara si checksum-ul sau SHA-512 de la Apache:

curl -fsSLO "https://dlcdn.apache.org/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz"
curl -fsSLO "https://downloads.apache.org/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz.sha512"

Fisierul SHA-512 al Apache contine doar hash-ul, deci asociati-l cu numele fisierului local inainte de a rula sha512sum:

printf '%s  apache-maven-%s-bin.tar.gz\n' "$(cat "apache-maven-$MAVEN_VERSION-bin.tar.gz.sha512")" "$MAVEN_VERSION" | sha512sum -c -

O verificare reusita afiseaza un rezultat OK pentru arhiva descarcata:

apache-maven-3.9.16-bin.tar.gz: OK

Extragerea Maven sub /opt

Extrageti arhiva verificata si pointati /opt/maven catre versiunea activa:

sudo tar -xzf "apache-maven-$MAVEN_VERSION-bin.tar.gz" -C /opt
sudo ln -sfn "/opt/apache-maven-$MAVEN_VERSION" /opt/maven

NOTA: Symlink-ul permite actualizarilor viitoare prin tarball sa comute versiunile Maven fara a rescrie fiecare profil shell.

Adaugarea Maven in PATH-ul sistemului

Creati un script de profil care face disponibil binarul Maven instalat manual in shell-urile noi de login:

bash
sudo tee /etc/profile.d/maven.sh > /dev/null <<'EOF'
if [ -d /opt/maven/bin ]; then
  case ":$PATH:" in
    *:/opt/maven/bin:*) ;;
    *) PATH="/opt/maven/bin:$PATH" ;;
  esac
  export PATH
fi
EOF

Incarcati scriptul de profil in shell-ul curent sau deschideti o sesiune noua de terminal:

source /etc/profile.d/maven.sh
hash -r

Confirmati ca shell-ul rezolva Maven-ul gestionat prin tarball primul:

command -v mvn
mvn -version | sed -n 's/^Apache Maven \([0-9.]*\).*/Apache Maven \1/p; /^Maven home:/p'

Metoda tarball trebuie sa raporteze Maven home sub /opt:

/opt/maven/bin/mvn
Apache Maven 3.9.16
Maven home: /opt/maven

Compilarea unui proiect Apache Maven de test pe Fedora

Un proiect de test verifica mai mult decat calea comenzii mvn. Confirma ca Maven poate accesa Maven Central, rezolva plugin-uri, creeaza o structura de proiect si produce un JAR:

cd ~
mvn -B archetype:generate \
  -DarchetypeGroupId=org.apache.maven.archetypes \
  -DgroupId=com.example \
  -DartifactId=maven-check \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DarchetypeVersion=1.5 \
  -DjavaCompilerVersion=17 \
  -DinteractiveMode=false
cd maven-check
mvn -B package

Tratati statusul final al build-ului ca semnal de succes:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Proiectul generat include pom.xml, fisiere de configurare Maven sub .mvn/, fisiere sursa Java sub src/main/java, fisiere de test sub src/test/java si un JAR ambalat sub target/. Eliminati directorul de test cand nu mai aveti nevoie de el:

cd ~
rm -rf maven-check

Gestionarea actualizarilor Apache Maven pe Fedora

Actualizarea Maven instalat cu DNF

Maven gestionat de DNF se actualizeaza odata cu pachetele Fedora:

sudo dnf upgrade --refresh maven

Un upgrade complet al sistemului actualizeaza de asemenea Maven cand Fedora publica un build nou de pachet:

sudo dnf upgrade --refresh

Actualizarea Maven instalat prin tarball

Metoda tarball este in afara package-manager-ului Fedora, deci actualizarile trebuie sa repete detectia versiunii Apache, verificarea checksum-ului, extractia si comutarea symlink-ului /opt/maven.

Actualizare manuala tarball Maven

Blocul manual mentine fiecare pas vizibil si actualizeaza /opt/maven doar cand Apache publica un tarball binar Maven 3 mai nou:

bash
MAVEN_VERSION=
MAVEN_PAGE=
CURRENT_VERSION=
if cd /tmp; then
  MAVEN_PAGE=$(curl -fsSL https://maven.apache.org/download.cgi)
  MAVEN_VERSION=$(printf '%s\n' "$MAVEN_PAGE" | grep -oE 'apache-maven-3\.[0-9.]+-bin\.tar\.gz' | sed -E 's/apache-maven-([0-9.]+)-bin\.tar\.gz/\1/' | sort -Vu | tail -n 1)
  CURRENT_VERSION=$(/opt/maven/bin/mvn -version 2>/dev/null | sed -n 's/^Apache Maven \([0-9.]*\).*/\1/p' | tail -n 1 || true)
else
  echo "Could not use /tmp as the download directory." >&2
fi

if [ -z "$MAVEN_VERSION" ]; then
  echo "Could not detect the current Maven 3 release." >&2
elif [ "$CURRENT_VERSION" = "$MAVEN_VERSION" ]; then
  printf 'Current: %s\nLatest:  %s\n' "${CURRENT_VERSION:-none}" "$MAVEN_VERSION"
  echo "Maven is already current."
else
  printf 'Current: %s\nLatest:  %s\n' "${CURRENT_VERSION:-none}" "$MAVEN_VERSION"
  curl -fsSLO "https://dlcdn.apache.org/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz"
  curl -fsSLO "https://downloads.apache.org/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz.sha512"
  printf '%s  apache-maven-%s-bin.tar.gz\n' "$(cat "apache-maven-$MAVEN_VERSION-bin.tar.gz.sha512")" "$MAVEN_VERSION" | sha512sum -c -
  sudo tar -xzf "apache-maven-$MAVEN_VERSION-bin.tar.gz" -C /opt
  sudo ln -sfn "/opt/apache-maven-$MAVEN_VERSION" /opt/maven
  hash -r
  /opt/maven/bin/mvn -version
fi

Daca tarball-ul instalat este deja curent, blocul manual se opreste inainte de download:

Current: 3.9.16
Latest:  3.9.16
Maven is already current.

Crearea unui helper reutilizabil update-maven

Pentru hosturi de build care folosesc metoda tarball in mod repetat, creati un helper protejat in /usr/local/bin. Setup-ul refuza sa suprascrie o comanda existenta nesemnificativa, apoi scrie scriptul update-maven:

bash
if [ -e /usr/local/bin/update-maven ] && ! grep -q 'LinuxCapable Apache Maven updater' /usr/local/bin/update-maven 2>/dev/null; then
  echo "Refusing to overwrite existing /usr/local/bin/update-maven" >&2
  false
else
  sudo install -d -m 0755 /usr/local/bin
  sudo tee /usr/local/bin/update-maven > /dev/null <<'EOF'
#!/usr/bin/env bash
# LinuxCapable Apache Maven updater
set -euo pipefail

install_parent=/opt
link_path=/opt/maven
stage_dir=
work_dir=$(mktemp -d)

cleanup() {
  rm -rf "$work_dir"
  if [ -n "$stage_dir" ]; then
    sudo rm -rf "$stage_dir" >/dev/null 2>&1 || true
  fi
}
trap cleanup EXIT

for cmd in curl grep sed sort tail sha512sum tar sudo mktemp java; do
  if ! command -v "$cmd" >/dev/null 2>&1; then
    echo "Missing required command: $cmd" >&2
    exit 1
  fi
done

page=$(curl -fsSL https://maven.apache.org/download.cgi)
latest=$(printf '%s\n' "$page" | grep -oE 'apache-maven-3\.[0-9.]+-bin\.tar\.gz' | sed -E 's/apache-maven-([0-9.]+)-bin\.tar\.gz/\1/' | sort -Vu | tail -n 1)

if [ -z "$latest" ]; then
  echo "Could not detect the current Maven 3 release." >&2
  exit 1
fi

current=$("$link_path/bin/mvn" -version 2>/dev/null | sed -n 's/^Apache Maven \([0-9.]*\).*/\1/p' | tail -n 1 || true)
printf 'Current: %s\nLatest:  %s\n' "${current:-none}" "$latest"

if [ "$current" = "$latest" ]; then
  echo "Maven is already current."
  exit 0
fi

cd "$work_dir"
archive="apache-maven-$latest-bin.tar.gz"
checksum="$archive.sha512"
curl -fsSLO "https://dlcdn.apache.org/maven/maven-3/$latest/binaries/$archive"
curl -fsSLO "https://downloads.apache.org/maven/maven-3/$latest/binaries/$checksum"
printf '%s  %s\n' "$(cat "$checksum")" "$archive" | sha512sum -c -

target_dir="$install_parent/apache-maven-$latest"
if [ -e "$target_dir" ] && [ ! -x "$target_dir/bin/mvn" ]; then
  echo "$target_dir exists but does not contain bin/mvn; refusing to overwrite it." >&2
  exit 1
fi

if [ ! -x "$target_dir/bin/mvn" ]; then
  stage_dir=$(sudo mktemp -d -p "$install_parent" ".apache-maven-$latest.XXXXXX")
  sudo tar -xzf "$archive" -C "$stage_dir" --strip-components=1
  sudo test -x "$stage_dir/bin/mvn"
  sudo chmod -R a+rX "$stage_dir"
  sudo mv -T "$stage_dir" "$target_dir"
  stage_dir=
fi

if [ -e "$link_path" ] && [ ! -L "$link_path" ]; then
  echo "$link_path exists and is not a symlink; refusing to replace it." >&2
  exit 1
fi

sudo ln -sfn "$target_dir" "$link_path"
hash -r
"$link_path/bin/mvn" -version
EOF

  sudo chmod 0755 /usr/local/bin/update-maven
  command -v update-maven
fi

Comanda finala trebuie sa afiseze calea helper-ului:

/usr/local/bin/update-maven

Rulati helper-ul manual cand sunteti gata sa verificati un update Maven 3 upstream:

update-maven

Cand un update upstream este disponibil, primele doua linii difera, linia de checksum trebuie sa se termine cu OK, iar output-ul final Maven trebuie sa raporteze in continuare /opt/maven ca Maven home:

Current: 3.9.15
Latest: 3.9.16
apache-maven-3.9.16-bin.tar.gz: OK
Apache Maven 3.9.16
Maven home: /opt/maven

Depanare probleme Apache Maven pe Fedora

Comanda Maven nu este gasita

Daca mvn lipseste dupa o instalare DNF, confirmati ca pachetul este instalat:

rpm -q maven
command -v mvn

Daca RPM-ul este instalat dar comanda lipseste, reinstalati pachetul:

sudo dnf reinstall maven

Pentru instalatiile tarball, confirmati ca scriptul de profil exista si incarcati-l in shell-ul curent:

cat /etc/profile.d/maven.sh
source /etc/profile.d/maven.sh
command -v mvn

Daca command -v mvn nu returneaza nimic, deschideti o sesiune noua de terminal si verificati ca /opt/maven/bin apare inaintea oricarei cai Maven mai vechi in $PATH.

Maven foloseste versiunea Java gresita

Verificati binarul Java pe care Maven il vede si comparati-l cu linia de runtime Maven:

readlink -f "$(command -v java)"
mvn -version

Daca sunt instalate mai multe JDK-uri, comutati atat runtime-ul cat si alternativele compilator astfel incat Maven si javac sa ramana aliniate:

sudo alternatives --config java
sudo alternatives --config javac

Unele plugin-uri citesc de asemenea JAVA_HOME. Derivati-l din binarul Java activ in loc sa codificati o cale invechita:

bash
JAVA_HOME=$(dirname "$(dirname "$(readlink -f "$(command -v java)")")")
printf 'export JAVA_HOME=%s\n' "$JAVA_HOME" | sudo tee /etc/profile.d/java-home.sh > /dev/null
source /etc/profile.d/java-home.sh
printf '%s\n' "$JAVA_HOME"

Download-urile de dependente Maven esueaza sau folosesc cache invechit

Din directorul proiectului care contine pom.xml, fortati Maven sa verifice din nou repository-urile remote inainte de a sterge ceva:

cd /path/to/your-project
mvn -U clean package

Daca un cache de dependente este corupt, rulati purge-ul de dependente Maven din aceeasi radacina de proiect:

mvn dependency:purge-local-repository

Stergerea ~/.m2/repository elimina dependentele descarcate pentru contul Linux. Pastrati codul sursa al proiectului si fisierele private de setari intacte cu exceptia cazului in care intentionati o resetare completa Maven:

rm -rf ~/.m2/repository

Recompilati proiectul dupa curatarea cache-ului pentru ca Maven sa descarce artefacte noi:

mvn -U clean package

Maven necesita un proxy pentru download-uri

Retelele corporative necesita adesea ca Maven sa foloseasca un proxy HTTP inainte de a putea accesa Maven Central. Creati un fisier de setari la nivel de utilizator si inlocuiti host-ul si portul cu detaliile proxy-ului organizatiei:

bash
mkdir -p ~/.m2
cat > ~/.m2/settings.xml <<'EOF'
<settings>
  <proxies>
    <proxy>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxy.example.com</host>
      <port>8080</port>
    </proxy>
  </proxies>
</settings>
EOF

Testati cu o comanda care trebuie sa contacteze Maven Central:

mvn -U help:effective-settings

URL-urile vechi de download Maven returneaza 404

CDN-ul principal Apache poarta activele versiunii curente, deci URL-urile directe mai vechi precum apache-maven-3.9.6-bin.zip pot inceta sa functioneze de la dlcdn.apache.org. Folositi arhiva Apache Maven 3 cand trebuie sa recuperati o versiune veche pentru testarea compatibilitatii si preferati pagina de download curenta pentru instalatiile normale Fedora.

Eliminarea Maven instalat cu DNF

Eliminati pachetul Fedora Maven cu DNF:

sudo dnf remove maven

DNF poate raporta dependente Java sau biblioteci Maven neutilizate dupa eliminare. Revizuiti tranzactia cu atentie inainte de a confirma o curatare autoremove:

sudo dnf autoremove

Verificati ca pachetul a disparut:

if rpm -q maven > /dev/null 2>&1; then
  echo "maven is still installed"
else
  echo "maven is not installed"
fi
maven is not installed

Eliminarea Maven instalat prin tarball

Eliminati directorul Maven instalat manual, symlink-ul activ, helper-ul optional de actualizare si scriptul de profil:

sudo rm -rf /opt/apache-maven-* /opt/maven
sudo rm -f /usr/local/bin/update-maven
sudo rm -f /etc/profile.d/maven.sh
hash -r
command -v mvn || echo "mvn command not found"

Daca shell-ul curent rezolva in continuare o cale Maven veche, deschideti o sesiune noua de terminal dupa eliminarea scriptului de profil.

Eliminarea cache-ului Maven si setarilor utilizatorului

ATENTIE: Comanda urmatoare sterge permanent setarile Maven, dependentele descarcate, credentialele stocate in settings.xml si cache-ul local pentru contul Linux curent. Faceti backup la orice credentiale de repository privat sau setari de mirror personalizate inainte de a continua.

rm -rf ~/.m2

Tip solutie

Permanent

Voteaza

(19 din 40 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?