--- name: java-maven-helper description: Maven build system, dependency management, and Java project configuration assistance. --- # Java Maven Dependency and Build Helper Skill Maven build system, dependency management, and Java project configuration assistance. ## Instructions You are a Maven and Java ecosystem expert. When invoked: 1. **Maven Project Management**: - Initialize and configure Maven projects - Manage pom.xml configuration - Handle project structure and organization - Configure multi-module projects - Use Maven archetypes 2. **Dependency Management**: - Add, update, and remove dependencies - Manage dependency scopes - Handle version conflicts - Use dependency management sections - Work with BOMs (Bill of Materials) 3. **Build Configuration**: - Configure plugins and goals - Set up build profiles - Manage build lifecycle - Configure properties and resources - Handle filtering and resource processing 4. **Troubleshooting**: - Fix dependency resolution errors - Debug build failures - Resolve plugin conflicts - Clean corrupted repositories - Handle version conflicts 5. **Best Practices**: Provide guidance on Maven project organization, dependency management, and build optimization ## Maven Basics ### Project Initialization ```bash # Create from archetype (interactive) mvn archetype:generate # Create quickstart project (non-interactive) mvn archetype:generate \ -DgroupId=com.example \ -DartifactId=my-app \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DarchetypeVersion=1.4 \ -DinteractiveMode=false # Create web application mvn archetype:generate \ -DgroupId=com.example \ -DartifactId=my-webapp \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false # Create Spring Boot application mvn archetype:generate \ -DgroupId=com.example \ -DartifactId=my-spring-app \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DinteractiveMode=false ``` ### Basic Commands ```bash # Clean build artifacts mvn clean # Compile project mvn compile # Run tests mvn test # Package (create JAR/WAR) mvn package # Install to local repository mvn install # Deploy to remote repository mvn deploy # Skip tests mvn package -DskipTests # Run specific test mvn test -Dtest=MyTest # Show dependency tree mvn dependency:tree # Show effective POM mvn help:effective-pom # Run project (with exec plugin) mvn exec:java -Dexec.mainClass="com.example.Main" ``` ## Usage Examples ``` @java-maven-helper @java-maven-helper --init-project @java-maven-helper --add-dependency @java-maven-helper --fix-dependencies @java-maven-helper --multi-module @java-maven-helper --troubleshoot ``` ## pom.xml Configuration ### Complete Example ```xml 4.0.0 com.example my-application 1.0.0-SNAPSHOT jar My Application A sample Maven project https://github.com/user/my-application 2024 Example Corp https://example.com Apache License, Version 2.0 https://www.apache.org/licenses/LICENSE-2.0 repo dev1 Developer Name dev@example.com Example Corp developer scm:git:git://github.com/user/my-application.git scm:git:ssh://github.com/user/my-application.git https://github.com/user/my-application HEAD 17 17 UTF-8 3.2.0 5.10.1 1.18.30 2.0.9 3.11.0 3.2.2 org.springframework.boot spring-boot-dependencies ${spring.boot.version} pom import org.springframework.boot spring-boot-starter-web org.projectlombok lombok ${lombok.version} provided org.slf4j slf4j-api ${slf4j.version} org.junit.jupiter junit-jupiter ${junit.version} test org.springframework.boot spring-boot-starter-test test ${project.artifactId} src/main/resources true org.apache.maven.plugins maven-compiler-plugin ${maven.compiler.plugin.version} ${maven.compiler.source} ${maven.compiler.target} org.apache.maven.plugins maven-surefire-plugin ${maven.surefire.plugin.version} org.springframework.boot spring-boot-maven-plugin ${spring.boot.version} repackage development true dev production prod central Maven Central https://repo.maven.apache.org/maven2 ``` ### Dependency Scopes ```xml org.apache.commons commons-lang3 3.14.0 compile javax.servlet javax.servlet-api 4.0.1 provided mysql mysql-connector-java 8.0.33 runtime org.junit.jupiter junit-jupiter 5.10.1 test com.example custom-lib 1.0 system ${project.basedir}/lib/custom-lib.jar org.springframework.boot spring-boot-dependencies 3.2.0 pom import ``` ## Project Structure ### Standard Maven Layout ``` my-app/ ├── pom.xml ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ ├── Main.java │ │ │ ├── model/ │ │ │ ├── service/ │ │ │ └── repository/ │ │ ├── resources/ │ │ │ ├── application.properties │ │ │ ├── logback.xml │ │ │ └── db/ │ │ │ └── migration/ │ │ └── webapp/ (for web apps) │ │ ├── WEB-INF/ │ │ │ └── web.xml │ │ └── index.html │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ └── MainTest.java │ └── resources/ │ └── test.properties ├── target/ (generated, git-ignored) └── .gitignore ``` ### Multi-Module Project ``` parent-project/ ├── pom.xml (parent) ├── module-core/ │ ├── pom.xml │ └── src/ ├── module-api/ │ ├── pom.xml │ └── src/ ├── module-web/ │ ├── pom.xml │ └── src/ └── module-cli/ ├── pom.xml └── src/ ``` ```xml 4.0.0 com.example parent-project 1.0.0-SNAPSHOT pom module-core module-api module-web module-cli 17 17 UTF-8 org.springframework.boot spring-boot-dependencies 3.2.0 pom import ``` ```xml 4.0.0 com.example parent-project 1.0.0-SNAPSHOT module-core org.springframework.boot spring-boot-starter ``` ## Dependency Management ### Adding Dependencies ```bash # Manually add to pom.xml # Or search on https://mvnrepository.com # Dependency format: # :: ``` ```xml com.google.guava guava 32.1.3-jre ``` ### Dependency Analysis ```bash # Show dependency tree mvn dependency:tree # Show dependency tree for specific artifact mvn dependency:tree -Dincludes=com.google.guava:guava # Analyze dependencies mvn dependency:analyze # List dependencies mvn dependency:list # Show updates available mvn versions:display-dependency-updates # Show plugin updates mvn versions:display-plugin-updates # Purge local repository mvn dependency:purge-local-repository ``` ### Version Management ```xml 5.3.31 5.10.1 org.springframework spring-core ${spring.version} org.springframework.boot spring-boot-dependencies 3.2.0 pom import org.springframework.boot spring-boot-starter-web ``` ### Excluding Transitive Dependencies ```xml com.example some-library 1.0.0 commons-logging commons-logging ``` ## Plugin Configuration ### Common Plugins #### Compiler Plugin ```xml org.apache.maven.plugins maven-compiler-plugin 3.11.0 17 17 UTF-8 -parameters -Xlint:unchecked ``` #### Surefire Plugin (Unit Tests) ```xml org.apache.maven.plugins maven-surefire-plugin 3.2.2 **/*Test.java **/*Tests.java -Xmx1024m ``` #### Failsafe Plugin (Integration Tests) ```xml org.apache.maven.plugins maven-failsafe-plugin 3.2.2 integration-test verify ``` #### JAR Plugin ```xml org.apache.maven.plugins maven-jar-plugin 3.3.0 true com.example.Main ``` #### Assembly Plugin (Fat JAR) ```xml org.apache.maven.plugins maven-assembly-plugin 3.6.0 jar-with-dependencies com.example.Main make-assembly package single ``` #### Shade Plugin (Uber JAR) ```xml org.apache.maven.plugins maven-shade-plugin 3.5.1 package shade com.example.Main ``` #### Exec Plugin ```xml org.codehaus.mojo exec-maven-plugin 3.1.1 com.example.Main ``` ```bash # Run with exec plugin mvn exec:java mvn exec:java -Dexec.mainClass="com.example.Main" mvn exec:java -Dexec.args="arg1 arg2" ``` ## Build Profiles ### Profile Configuration ```xml dev true development jdbc:h2:mem:testdb com.h2database h2 runtime prod production jdbc:postgresql://prod-db:5432/app org.postgresql postgresql runtime org.apache.maven.plugins maven-compiler-plugin false true test test ``` ```bash # Activate profile mvn clean install -Pprod # Activate multiple profiles mvn clean install -Pdev,integration-tests # List active profiles mvn help:active-profiles # Show profile-specific settings mvn help:effective-pom -Pprod ``` ## Common Issues & Solutions ### Issue: Dependency Not Found ```bash # Error: Could not find artifact # Solution 1: Check repository configuration mvn dependency:tree # Solution 2: Update Maven metadata mvn -U clean install # -U forces update # Solution 3: Clear local repository rm -rf ~/.m2/repository/com/example/problematic-artifact mvn clean install # Solution 4: Check network/proxy settings # Add to ~/.m2/settings.xml ``` ```xml example-proxy true http proxy.example.com 8080 ``` ### Issue: Version Conflicts ```bash # Show dependency conflicts mvn dependency:tree -Dverbose # Analyze dependency conflicts mvn dependency:analyze-duplicate # Solution: Use dependencyManagement ``` ```xml com.google.guava guava 32.1.3-jre ``` ### Issue: Corrupted Repository ```bash # Clean local repository mvn dependency:purge-local-repository # Or manually remove rm -rf ~/.m2/repository # Rebuild mvn clean install ``` ### Issue: Out of Memory ```bash # Increase Maven memory export MAVEN_OPTS="-Xmx2048m -XX:MaxPermSize=512m" # Or set in .mavenrc echo "MAVEN_OPTS='-Xmx2048m'" > ~/.mavenrc # For Windows (setenv.bat) set MAVEN_OPTS=-Xmx2048m -XX:MaxPermSize=512m ``` ### Issue: Slow Builds ```bash # Use parallel builds mvn -T 4 clean install # 4 threads mvn -T 1C clean install # 1 thread per CPU core # Skip tests mvn clean install -DskipTests # Offline mode (use local repository only) mvn -o clean install # Use incremental builds mvn clean install -amd # Also make dependents ``` ## settings.xml Configuration ### Local Repository and Mirrors ```xml ${user.home}/.m2/repository nexus Nexus Repository https://nexus.example.com/repository/maven-public/ * nexus-releases deployment password123 nexus central https://nexus.example.com/repository/maven-public/ true true nexus ``` ## Testing Configuration ### JUnit 5 ```xml org.junit.jupiter junit-jupiter 5.10.1 test org.mockito mockito-core 5.7.0 test org.assertj assertj-core 3.24.2 test ``` ### Code Coverage (JaCoCo) ```xml org.jacoco jacoco-maven-plugin 0.8.11 prepare-agent report test report check check PACKAGE LINE COVEREDRATIO 0.80 ``` ```bash # Generate coverage report mvn clean test jacoco:report # View report at target/site/jacoco/index.html ``` ## CI/CD Configuration ### GitHub Actions ```yaml name: Maven Build on: [push, pull_request] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' cache: 'maven' - name: Build with Maven run: mvn clean install -B - name: Run tests run: mvn test - name: Generate coverage report run: mvn jacoco:report - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: files: ./target/site/jacoco/jacoco.xml ``` ### GitLab CI ```yaml image: maven:3.9-eclipse-temurin-17 variables: MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository" cache: paths: - .m2/repository stages: - build - test - package build: stage: build script: - mvn compile test: stage: test script: - mvn test - mvn jacoco:report artifacts: reports: junit: - target/surefire-reports/TEST-*.xml paths: - target/site/jacoco package: stage: package script: - mvn package -DskipTests artifacts: paths: - target/*.jar ``` ## Best Practices Summary ### Project Organization - Follow standard Maven directory layout - Use multi-module structure for large projects - Keep pom.xml clean and organized - Use properties for version management - Document custom configuration ### Dependency Management - Use dependencyManagement for version control - Prefer BOMs for framework dependencies - Minimize dependencies - Regularly update dependencies - Use appropriate scopes - Exclude unnecessary transitive dependencies ### Build Configuration - Use build profiles for different environments - Configure plugins properly - Use appropriate packaging type - Set Java version explicitly - Enable parallel builds when possible ### Testing - Separate unit and integration tests - Use JaCoCo for code coverage - Set coverage thresholds - Run tests in CI/CD pipeline - Use appropriate test frameworks ### Performance - Use parallel builds (-T) - Enable offline mode when possible - Use Maven repository manager (Nexus/Artifactory) - Configure appropriate memory settings - Cache dependencies in CI/CD ## Quick Reference Commands ```bash # Project lifecycle mvn clean # Clean build artifacts mvn compile # Compile source code mvn test # Run tests mvn package # Create JAR/WAR mvn install # Install to local repo mvn deploy # Deploy to remote repo # Dependency management mvn dependency:tree # Show dependency tree mvn dependency:analyze # Analyze dependencies mvn versions:display-dependency-updates # Check for updates # Running mvn exec:java # Run main class mvn spring-boot:run # Run Spring Boot app # Profiles mvn clean install -Pprod # Activate profile # Options mvn clean install -DskipTests # Skip tests mvn clean install -T 4 # Parallel build mvn clean install -U # Force update mvn clean install -o # Offline mode # Information mvn help:effective-pom # Show effective POM mvn help:active-profiles # Show active profiles ``` ## Notes - Always use dependencyManagement for multi-module projects - Keep Maven version up to date - Use Maven Wrapper (mvnw) for consistent builds - Configure settings.xml for organization-wide settings - Use profiles for environment-specific configuration - Enable parallel builds for faster compilation - Set up repository manager for better performance - Use BOMs to manage framework versions - Document custom plugin configurations - Regularly audit and update dependencies