## page was renamed from ApacheMaven
= Apache Maven =
Maven is a software project management and comprehension tool.
Based on the concept of a Project Object Model (POM), Maven can
manage a project's build, reporting and documentation from a
central piece of information.

Requires Java.

== Slackbuild ==
 * su
 * cd /tmp
 * wget http://slackbuilds.org/slackbuilds/14.0/development/apache-maven.tar.gz
 * tar xvzf apache-maven.tar.gz
 * cd apache-maven
 * wget http://archive.apache.org/dist/maven/binaries/apache-maven-3.0.4-bin.tar.gz
 * ./apache-maven.SlackBuild 
 * installpkg /tmp/apache-maven-3.0.4-noarch-1_SBo.tgz 

Package:  [[attachment:apache-maven-3.0.4-noarch-1_SBo.tgz]]

== User settings ==
You can specify your user configuration in ${user.home}/.m2/settings.xml.
The default location of your local repository is ${user.home}/.m2/repository/.

== Maven sample web app for JBoss AS 7.1.1 ==

=== Web application creation ===
 * cd ~
 * mvn archetype:generate -DgroupId=org.allowed.bitarus -DartifactId=WebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
 * cd WebApp
 * mvn clean
 * mvn compile
 * mvn package

Sample WebApp file with source code to use MySQL data source:[[attachment:WebApp.zip]]

Sample WebAppJersey2, with dependencies for Jersey2 and JSON, to be deployed on Tomcat 7:[[attachment:WebAppJersey2.zip]]

=== Deploy web application on jboss AS 7.1.1 ===
 * /opt/jboss-as-7.1.1.Final/bin/standalone.sh 
 * http://localhost:9990
 * admin 12345678
 * Manage deployments
 * Add content
 * Choose file ~/WebApp/target/WebApp.war
 * next, save
 * enable , confirm
 * http://localhost:8080/WebApp/


=== Add REST and servlet support ===
 * url http://localhost:8080/WebApp/rest/testSvc/paramx

Add dependencies to pom.xml, jboss AS 7.1.1 JAX-RS
{{{#!highlight xml
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxrs</artifactId>
    <version>2.2.1.GA</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
</dependency>
}}}

In JBoss 5.1.0 comment the scope provided for resteasy, to add to WEB-INF folder the required libraries for resteasy.

=== Create source code for REST service and servlet ===
File src/main/java/org/allowed/bitarus/TestService.java

URL http://localhost:8080/WebApp/rest/testSvc/asddddd

{{{#!highlight java
package org.allowed.bitarus;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

@Path("/testSvc")
public class TestService {

    @GET
    @Path("/{param}")
    public Response getMsg(@PathParam("param") String msg) {
        String out = String.format("testSvc returns %s", msg);
        return Response.status(200).entity(out).build();
    }

}

}}}

File src/main/java/org/allowed/bitarus/Servletx.java 

http://localhost:8080/WebApp/servletxxx

{{{#!highlight java
// File src/main/java/org/allowed/bitarus/Servletx.java 
// References EJB in JBoss5. Test to see EJB invocation from Tomcat
package org.allowed.bitarus;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

import java.security.Security;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.allowed.bitarus.IWSTest;

public class Servletx extends HttpServlet{
    public void service(HttpServletRequest req, HttpServletResponse res) throws IOException
    {
        res.setContentType("text/html");
        PrintWriter out = res.getWriter();
        String text="";
        try{
          Properties env = new Properties();
          env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
          env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
          env.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099");
          InitialContext context = new InitialContext(env);
          IWSTest test = (IWSTest) context.lookup("WSTest/remote");
          text=test.helloWorld();
        }
        catch(Exception ex){
        }
        out.println("<html><head><title>Hello World!</title></head>");
        out.println(String.format("<body><h1>Hello World! %s </h1></body></html>",text));
    }
}

}}}

Dependency for JAR that has IWSTest interface that WSTest EJB implements:
{{{#!highlight xml
   <dependency>
      <groupId>org.allowed.bitarus</groupId>
      <artifactId>test2</artifactId>
      <version>0.0.1</version>
    </dependency>
}}}


=== Configure web app ===
File src/main/webapp/WEB-INF/web.xml 

{{{#!highlight xml
<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
  </context-param>
 
  <context-param>
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/rest</param-value>
  </context-param>

  <servlet>
    <servlet-name>resteasy-servlet</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>resteasy-servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>Servletx</servlet-name>
    <servlet-class>org.allowed.bitarus.Servletx</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servletx</servlet-name>
    <url-pattern>/servletxxx</url-pattern> 
  </servlet-mapping>
</web-app>

}}}

== Dependencies scopes on pom.xml ==
=== compile ===
compile is the default scope; all dependencies are compile-scoped if a scope is not supplied. compile dependencies are available in all classpaths, and '''they are packaged'''.
=== provided ===
provided dependencies are used when you expect the '''JDK or a container to provide them'''.

== Eclipse plugin ==
=== Install on Eclipse 3.8.2 ===
 * Choose Help menu
 * Install new software
 * Name: M2Eclipse
 * Location: http://download.eclipse.org/technology/m2e/releases
 * Maven Integration For Eclipse
 * Select all
 * next
 * next 
 * I accept
 * Finish

=== Import existing project ===
 * Java perspective
 * Import
 * Maven
 * Existing Maven project
 * next
 * root folder
 * next
 * finish

== Maven sample enterprise app ==
 * cd /tmp
 * mvn archetype:generate -DgroupId=org.allowed.bitarus -DartifactId=EnterpriseApp -DarchetypeArtifactId=org.jboss.spec.archetypes.jboss-javaee6-ear-webapp -DinteractiveMode=false
 * cd EnterpriseApp/
 * Edit pom.xml and comment site module
 * mvn clean
 * mvn compile
 * mvn package #  /tmp/EnterpriseApp/EnterpriseApp-ear/target/EnterpriseApp.ear
 * Deploy the EnterpriseApp.ear with http://localhost:9990
 * Open http://localhost:8080/EnterpriseApp/index.jsf

== Maven sample ejb JEE5 ==
 * cd /tmp
 * mvn archetype:generate -DgroupId=org.allowed.bitarus -DartifactId=EjbJEE5 -DarchetypeArtifactId=org.codehaus.mojo.archetypes.ejb-jee5 -DinteractiveMode=false
 * cd EnterpriseApp/
 * Edit pom.xml and comment site module
 * mvn clean
 * mvn compile
 * mvn package #  /tmp/EnterpriseApp/EnterpriseApp-ear/target/EnterpriseApp.ear

== POM EJB 3.0 + JAX-WS + JBoss 5.1.0 ==
For JBoss 5.0.  Source code Java below folder ejbModule.
Create source folder in Eclipse named ejbModule.

pom.xml
{{{#!highlight xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.allowed.bitarus</groupId>
  <artifactId>test2</artifactId>
  <version>0.0.1</version>
  <packaging>ejb</packaging>
  
  <build>
    <sourceDirectory>ejbModule</sourceDirectory>
    <resources>
      <resource>
        <directory>ejbModule</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <artifactId>maven-ejb-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <ejbVersion>3.0</ejbVersion>
        </configuration>
      </plugin>
    </plugins>
  </build>
  
  <dependencies>
    <dependency>
        <!-- EJB 3.0 -->
	<groupId>javax.ejb</groupId>
	<artifactId>ejb-api</artifactId>
	<version>3.0</version>
    </dependency>
    <dependency>
	<!--jax ws web servies -->
        <groupId>sun-jaxws</groupId>
        <artifactId>jsr181-api</artifactId>
        <version>1.0</version>
    </dependency>

<dependency>
	<groupId>javaee</groupId>
	<artifactId>javaee-api</artifactId>
	<version>5</version>
</dependency>

  </dependencies>
</project>
}}}

Source code files in ejbModule/org/allowed/bitarus
{{{#!highlight java
//WSTest.java
package org.allowed.bitarus;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.naming.Context;
import javax.naming.InitialContext;

/**
 * Session Bean implementation class WSTest
 */
@Stateless
@WebService
// http://localhost:8080/test2-0.0.1/WSTest?wsdl
public class WSTest implements WSTestRemote, WSTestLocal {
	private static final String QUERY1 = "SELECT distinct table_name FROM user_tables";
	private static final String JNDI_DATASOURCE = "java:OracleDS";
        // private static final String QUERY1 = "select table_name from information_schema.tables;";
        // private static final String JNDI_DATASOURCE = "java:/MysqlDS";

	public WSTest() {
	}

	@WebMethod
	public String helloWorld() {
		return "Hello world";
	}

	@WebMethod
	public String[] checkDB() {
		ArrayList<String> list = new ArrayList<String>();

		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		try {
			Context ctx = new InitialContext();
			conn = ((javax.sql.DataSource) ctx.lookup(WSTest.JNDI_DATASOURCE)).getConnection();
			ps = conn.prepareStatement(WSTest.QUERY1);
			rs = ps.executeQuery();
			while (rs.next()) {
				list.add(rs.getString(1));
			}
		} catch (Exception e) {
			list.add(e.getMessage());
		} finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}

			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		
		String[] r = new String[list.size()];
		list.toArray(r);
		return r;
	}
}
}}}

{{{#!highlight java
//WSTestLocal.java
package org.allowed.bitarus;
import javax.ejb.Local;

@Local
public interface WSTestLocal extends IWSTest{
}
}}}

{{{#!highlight java
//WSTestRemote.java
package org.allowed.bitarus;
import javax.ejb.Remote;

@Remote
public interface WSTestRemote  extends IWSTest{
}
}}}

{{{#!highlight java
//IWSTest
package org.allowed.bitarus;

public interface IWSTest {
  public String helloWorld();
}
}}}

Build EJB JAR with maven
 * mvn clean compile package

In http://localhost:8080/admin-console/ at link EJB 3.x Application (EJB JAR), add resource test2-0.0.1.jar.

In JBoss 5.1.0 copy the following libraries from the JBOSS_HOME/client directory to the JBOSS_HOME/lib/endorsed directory,  
so that the JAX-WS 2.0 apis supported by JBossWS are used:
 * jbossws-native-saaj.jar
 * jbossws-native-jaxrpc.jar
 * jbossws-native-jaxws.jar
 * jbossws-native-jaxws-ext.jar

Check deployed EJB with http://localhost:8080/test2-0.0.1/WSTest?wsdl 

File structure:
{{{
vitor@darkstar$tree .
.
|-- ejbModule
|   `-- org
|       `-- allowed
|           `-- bitarus
|               |-- IWSTest.java
|               |-- WSTest.java
|               |-- WSTestLocal.java
|               `-- WSTestRemote.java
|-- pom.xml
`-- target
    |-- classes
    |   `-- org
    |       `-- allowed
    |           `-- bitarus
    |               |-- IWSTest.class
    |               |-- WSTest.class
    |               |-- WSTestLocal.class
    |               `-- WSTestRemote.class
    |-- maven-archiver
    |   `-- pom.properties
    |-- surefire
    `-- test2-0.0.1.jar

11 directories, 11 files
}}}

=== Oracle datasource for JBoss 5 ===
Copy to <...>\jboss-5.1.0.GA\server\default\deploy\oracle-ds.xml

Copy ojdbc6.jar to <...>\jboss-5.1.0.GA\server\default\lib

{{{#!highlight xml
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
    <!-- copy ojdbc6.jar to <...>\jboss-5.1.0.GA\server\default\lib -->
    <local-tx-datasource>
        <jndi-name>OracleDS</jndi-name>
        <connection-url>jdbc:oracle:thin:@localhost:1521:xe</connection-url>
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        <user-name>SYSTEM</user-name>
        <password>jboss</password>
        <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name>
        <metadata>
            <type-mapping>Oracle9i</type-mapping>
        </metadata>
    </local-tx-datasource>
</datasources>
}}}

=== MySQL datasource for JBoss 5 ===
Copy to <...>\jboss-5.1.0.GA\server\default\deploy\mysql-ds.xml

Copy  mysql-connector-java-5.1.30-bin.jar to <...>\jboss-5.1.0.GA\server\default\lib

{{{#!highlight xml
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
    <local-tx-datasource>
    <jndi-name>MysqlDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/mysql</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>12345678</password>  
 <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name>
    <metadata>
    <type-mapping>mySQL</type-mapping>
    </metadata>
    </local-tx-datasource>
</datasources>
}}}


== Assembly plugin ==
The Assembly Plugin for Maven is primarily intended to allow users to aggregate the project output along with its dependencies, modules, site documentation, and other files into a single distributable archive.

http://maven.apache.org/plugins/maven-assembly-plugin/usage.html

{{{
<project>
  <!-- ... -->
  <build>
    <!-- ... -->
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
</project>
}}}

== Standalone app - Fat JAR ==
pom.xml
{{{
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
        http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.example</groupId>
	<artifactId>artifactX</artifactId>
	<packaging>jar</packaging>
	<version>0.0.1</version>
	<name>artifactX</name>
	<url>http://maven.apache.org</url>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>2.4</version>
				<configuration>
					<descriptorRefs>
						<descriptorRef>jar-with-dependencies</descriptorRef>
					</descriptorRefs>
					<archive>
						<manifest>
							<mainClass>com.example.Main</mainClass>
						</manifest>
					</archive>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id> 
						<phase>package</phase> 
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.3</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.31</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.7</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-simple</artifactId>
			<version>1.7.7</version>
		</dependency>
	</dependencies>
</project>
}}}

Init script:
{{{
#!/bin/sh
# chkconfig: 345 99 99
# description: Starts and stops the progx process
USER=userx
PROG=progx
PIDFILE="/tmp/progx.pid"
PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin"
LOG="/tmp/progx.log"
JAVA="/usr/java/jdk1.6.0_26/bin/java"
JARFILE="/home/userx/progx-0.0.1-jar-with-dependencies.jar"

start(){
  echo "Start called $PROG with user $USER"
  su - $USER -c "$JAVA -jar $JARFILE " &
  /bin/sleep 2
  PID=`ps uax| grep java | grep $PROG | grep $USER | awk '{print $2}'`
  echo "Program $PROG running with PID: $PID"
  echo "$PID" > $PIDFILE
}

status(){
  PID=`cat $PIDFILE`
  echo "Running $PROG with PID: $PID"
}

stop(){
  echo "Stop called for $PROG"
  PID=`cat $PIDFILE`
  echo "PID to kill $PROG  $PID"
  kill -9 $PID
  rm $PIDFILE
}

# switch
case "$1" in
  start)
    start
    ;;
  status)
    status
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo "$PROG start|status|stop|restart"
    exit 1
;;
esac
}}}

== Install JAR local repository ==
To install a JAR in the local repository use the following command:
{{{
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
}}}

{{{
mvn install:install-file -DgroupId=com.sun -DartifactId=tools -Dversion=1.4.2 -Dpackaging=jar -Dfile=C:\temp\test\tools.jar”
}}}

Dependency:
{{{
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.4.2</version>
</dependency>
}}}

== Maven skip tests ==
http://maven.apache.org/surefire/maven-surefire-plugin/examples/skipping-test.html

 * mvn clean install -Dmaven.test.skip=true
 * mvn clean install -DskipTests
or 
{{{#!highlight xml
<project>
  <!-- [...] -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.18.1</version>
        <configuration>
          <skipTests>true</skipTests>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <!-- [...] -->
</project>
}}}

== Ant run plugin - copy ==
{{{
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.8</version>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>install</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target name="Copy war">
                                <copy file="target/test.war" tofile="C:/Java/apache-tomcat-7.0.57/webapps/test.war" verbose="true" />
                            </target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
}}}

== Download javadoc ==
 * mvn clean install dependency:resolve -Dclassifier=javadoc

== Install raw maven in Slackware ==
{{{#!highlight bash
cd ~/Downloads
wget http://www-eu.apache.org/dist/maven/maven-3/3.5.3/binaries/apache-maven-3.5.3-bin.tar.gz
cp apache-maven-3.5.3-bin.tar.gz /opt/java
cd /opt/java 
tar xvzf apache-maven-3.5.3-bin.tar.gz 
cd apache-maven-3.5.3/bin/
./mvn
PATH=$PATH:/opt/java/jdk1.8.0_162/bin:/opt/java/apache-maven-3.5.3/bin

}}}


== Check dependencies for artifact ==
 * set artifact in pom.xml file
 * run mvn dependency:tree --log-file out.txt
{{{#!highlight xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>check-dep</groupId>
  <artifactId>check-dep</artifactId>
  <version>0.0.1</version>
  <packaging>pom</packaging>
  <repositories>
    <repository>
      <id>android-repo</id>
      <name>android-repo</name>
      <url>https://dl.google.com/dl/android/maven2/</url>
    </repository>
    <repository>
      <id>spring-io-plugins-release</id>
      <name>spring-io-plugins-release</name>
      <url>https://repo.spring.io/plugins-release/</url>
    </repository>
  </repositories>
  <dependencies>
    <dependency>
      <groupId>com.android.tools.build</groupId>
      <artifactId>gradle</artifactId>
      <version>2.3.1</version>
    </dependency>
    <dependency>
      <groupId>androidx.annotation</groupId>
      <artifactId>annotation</artifactId>
      <version>1.0.0</version>
    </dependency>      
    <dependency>
        <groupId>androidx.core</groupId>
        <artifactId>core</artifactId>
        <version>1.0.2</version>
        <type>aar</type>
    </dependency>
    <dependency>
      <groupId>androidx.legacy</groupId>
      <artifactId>legacy-support-v4</artifactId>
      <version>1.0.0</version>
      <type>aar</type>
    </dependency>
    <dependency>
      <groupId>com.google.android.gms</groupId>
      <artifactId>play-services-analytics</artifactId>
      <version>11.0.1</version>
      <type>aar</type>
    </dependency>
    <dependency>
      <groupId>com.google.firebase</groupId>
      <artifactId>firebase-analytics</artifactId>
      <version>17.2.3</version>
      <type>aar</type>
    </dependency>
    <dependency>
      <groupId>com.google.firebase</groupId>
      <artifactId>firebase-messaging</artifactId>
      <version>20.1.7</version>
      <type>aar</type>
    </dependency>
    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp-urlconnection</artifactId>
      <version>3.10.0</version>
    </dependency>
    <dependency>
      <groupId>me.leolin</groupId>
      <artifactId>ShortcutBadger</artifactId>
      <version>1.1.22</version>
      <type>aar</type>
    </dependency>
    <dependency>
      <groupId>com.android.support</groupId>
      <artifactId>appcompat-v7</artifactId>
      <version>23.4.0</version>
      <type>aar</type>
    </dependency>
  </dependencies>
</project>
}}}

=== Sample output ===
{{{
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ check-dep ---
[INFO] check-dep:check-dep:pom:0.0.1
[INFO] +- com.android.tools.build:gradle:jar:2.3.1:compile
[INFO] |  \- com.android.tools.build:gradle-core:jar:2.3.1:runtime
[INFO] |     +- com.android.tools.build:builder:jar:2.3.1:runtime
[INFO] |     |  +- com.android.tools.build:builder-model:jar:2.3.1:runtime
[INFO] |     |  +- com.android.tools.build:builder-test-api:jar:2.3.1:runtime
[INFO] |     |  +- com.android.tools:sdklib:jar:25.3.1:runtime
[INFO] |     |  |  +- com.android.tools.layoutlib:layoutlib-api:jar:25.3.1:runtime
[INFO] |     |  |  |  \- com.intellij:annotations:jar:12.0:runtime
[INFO] |     |  |  +- com.android.tools:dvlib:jar:25.3.1:runtime
[INFO] |     |  |  +- com.android.tools:repository:jar:25.3.1:runtime
[INFO] |     |  |  |  \- com.google.jimfs:jimfs:jar:1.1:runtime
[INFO] |     |  |  +- com.google.code.gson:gson:jar:2.2.4:runtime
[INFO] |     |  |  +- org.apache.commons:commons-compress:jar:1.8.1:runtime
[INFO] |     |  |  +- org.apache.httpcomponents:httpclient:jar:4.1.1:runtime
[INFO] |     |  |  |  +- org.apache.httpcomponents:httpcore:jar:4.1:runtime
[INFO] |     |  |  |  +- commons-logging:commons-logging:jar:1.1.1:runtime
[INFO] |     |  |  |  \- commons-codec:commons-codec:jar:1.4:runtime
[INFO] |     |  |  \- org.apache.httpcomponents:httpmime:jar:4.1:runtime
[INFO] |     |  +- com.android.tools:sdk-common:jar:25.3.1:runtime
[INFO] |     |  +- com.android.tools:common:jar:25.3.1:runtime
[INFO] |     |  +- com.android.tools.build:manifest-merger:jar:25.3.1:runtime
[INFO] |     |  |  \- net.sf.kxml:kxml2:jar:2.3.0:runtime
[INFO] |     |  +- com.android.tools.ddms:ddmlib:jar:25.3.1:runtime
[INFO] |     |  +- com.android.tools.jack:jack-api:jar:0.13.0:runtime
[INFO] |     |  +- com.android.tools.jill:jill-api:jar:0.10.0:runtime
[INFO] |     |  +- com.android.tools.analytics-library:protos:jar:25.3.1:runtime
[INFO] |     |  +- com.android.tools.analytics-library:shared:jar:25.3.1:runtime
[INFO] |     |  +- com.android.tools.analytics-library:tracker:jar:25.3.1:runtime
[INFO] |     |  +- com.squareup:javawriter:jar:2.5.0:runtime
[INFO] |     |  +- org.bouncycastle:bcpkix-jdk15on:jar:1.48:runtime
[INFO] |     |  +- org.bouncycastle:bcprov-jdk15on:jar:1.48:runtime
[INFO] |     |  \- org.ow2.asm:asm-tree:jar:5.0.4:runtime
[INFO] |     +- com.android.tools.lint:lint:jar:25.3.1:runtime
[INFO] |     |  +- com.android.tools.lint:lint-checks:jar:25.3.1:runtime
[INFO] |     |  |  +- com.android.tools.lint:lint-api:jar:25.3.1:runtime
[INFO] |     |  |  |  +- com.android.tools.external.com-intellij:uast:jar:162.2228.14:runtime
[INFO] |     |  |  |  \- com.android.tools.external.lombok:lombok-ast:jar:0.2.3:runtime
[INFO] |     |  |  \- org.ow2.asm:asm-analysis:jar:5.0.4:runtime
[INFO] |     |  \- org.eclipse.jdt.core.compiler:ecj:jar:4.6.1:runtime
[INFO] |     +- com.android.tools.build:transform-api:jar:2.0.0-deprecated-use-gradle-api:runtime
[INFO] |     +- com.android.tools.build:gradle-api:jar:2.3.1:runtime
[INFO] |     |  \- com.google.guava:guava:jar:18.0:runtime
[INFO] |     +- com.android.databinding:compilerCommon:jar:2.3.1:runtime
[INFO] |     |  +- com.android.databinding:baseLibrary:jar:2.3.1:runtime
[INFO] |     |  +- org.antlr:antlr4:jar:4.5.3:runtime
[INFO] |     |  +- commons-io:commons-io:jar:2.4:runtime
[INFO] |     |  +- com.googlecode.juniversalchardet:juniversalchardet:jar:1.0.3:runtime
[INFO] |     |  \- com.android.tools:annotations:jar:24.5.0:runtime
[INFO] |     +- org.ow2.asm:asm:jar:5.0.4:runtime
[INFO] |     +- org.ow2.asm:asm-commons:jar:5.0.4:runtime
[INFO] |     +- net.sf.proguard:proguard-gradle:jar:5.3.2:runtime
[INFO] |     |  \- net.sf.proguard:proguard-base:jar:5.3.2:runtime
[INFO] |     +- org.jacoco:org.jacoco.core:jar:0.7.5.201505241946:runtime
[INFO] |     |  \- org.ow2.asm:asm-debug-all:jar:5.0.1:runtime
[INFO] |     +- org.jacoco:org.jacoco.report:jar:0.7.5.201505241946:runtime
[INFO] |     +- net.sf.jopt-simple:jopt-simple:jar:4.9:runtime
[INFO] |     +- com.google.protobuf:protobuf-java:jar:3.0.0:runtime
[INFO] |     \- org.antlr:antlr:jar:3.5.2:runtime
[INFO] |        +- org.antlr:antlr-runtime:jar:3.5.2:runtime
[INFO] |        \- org.antlr:ST4:jar:4.0.8:runtime
[INFO] +- androidx.annotation:annotation:jar:1.0.0:compile
[INFO] +- androidx.core:core:aar:1.0.2:compile
[INFO] |  +- androidx.collection:collection:jar:1.0.0:compile
[INFO] |  +- androidx.lifecycle:lifecycle-runtime:aar:2.0.0:compile
[INFO] |  |  +- androidx.lifecycle:lifecycle-common:jar:2.0.0:compile
[INFO] |  |  \- androidx.arch.core:core-common:jar:2.0.0:compile
[INFO] |  \- androidx.versionedparcelable:versionedparcelable:aar:1.0.0:compile
[INFO] +- androidx.legacy:legacy-support-v4:aar:1.0.0:compile
[INFO] |  +- androidx.media:media:aar:1.0.0:compile
[INFO] |  +- androidx.legacy:legacy-support-core-utils:aar:1.0.0:compile
[INFO] |  |  +- androidx.documentfile:documentfile:aar:1.0.0:compile
[INFO] |  |  +- androidx.loader:loader:aar:1.0.0:compile
[INFO] |  |  |  \- androidx.lifecycle:lifecycle-livedata:aar:2.0.0:compile
[INFO] |  |  |     +- androidx.arch.core:core-runtime:aar:2.0.0:compile
[INFO] |  |  |     \- androidx.lifecycle:lifecycle-livedata-core:aar:2.0.0:compile
[INFO] |  |  +- androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0:compile
[INFO] |  |  \- androidx.print:print:aar:1.0.0:compile
[INFO] |  +- androidx.legacy:legacy-support-core-ui:aar:1.0.0:compile
[INFO] |  |  +- androidx.customview:customview:aar:1.0.0:compile
[INFO] |  |  +- androidx.viewpager:viewpager:aar:1.0.0:compile
[INFO] |  |  +- androidx.coordinatorlayout:coordinatorlayout:aar:1.0.0:compile
[INFO] |  |  +- androidx.drawerlayout:drawerlayout:aar:1.0.0:compile
[INFO] |  |  +- androidx.slidingpanelayout:slidingpanelayout:aar:1.0.0:compile
[INFO] |  |  +- androidx.interpolator:interpolator:aar:1.0.0:compile
[INFO] |  |  +- androidx.swiperefreshlayout:swiperefreshlayout:aar:1.0.0:compile
[INFO] |  |  +- androidx.asynclayoutinflater:asynclayoutinflater:aar:1.0.0:compile
[INFO] |  |  \- androidx.cursoradapter:cursoradapter:aar:1.0.0:compile
[INFO] |  \- androidx.fragment:fragment:aar:1.0.0:compile
[INFO] |     \- androidx.lifecycle:lifecycle-viewmodel:aar:2.0.0:compile
[INFO] +- com.google.android.gms:play-services-analytics:aar:11.0.1:compile
[INFO] |  +- com.google.android.gms:play-services-analytics-impl:aar:11.0.1:compile (version selected from constraint [11.0.1,11.0.1])
[INFO] |  +- com.google.android.gms:play-services-base:aar:11.0.1:compile (version selected from constraint [11.0.1,11.0.1])
[INFO] |  |  \- com.google.android.gms:play-services-tasks:aar:11.0.1:compile (version selected from constraint [11.0.1,11.0.1])
[INFO] |  +- com.google.android.gms:play-services-basement:aar:11.0.1:compile (version selected from constraint [11.0.1,11.0.1])
[INFO] |  \- com.google.android.gms:play-services-tagmanager-v4-impl:aar:11.0.1:compile (version selected from constraint [11.0.1,11.0.1])
[INFO] +- com.google.firebase:firebase-analytics:aar:17.2.3:compile
[INFO] |  +- com.google.android.gms:play-services-measurement:aar:17.2.3:compile
[INFO] |  |  +- com.google.android.gms:play-services-measurement-base:aar:17.2.3:compile (version selected from constraint [17.2.3,17.2.3])
[INFO] |  |  \- com.google.android.gms:play-services-measurement-impl:aar:17.2.3:compile (version selected from constraint [17.2.3,17.2.3])
[INFO] |  |     \- com.google.android.gms:play-services-ads-identifier:aar:17.0.0:compile
[INFO] |  +- com.google.android.gms:play-services-measurement-api:aar:17.2.3:compile
[INFO] |  |  \- com.google.android.gms:play-services-measurement-sdk-api:aar:17.2.3:compile (version selected from constraint [17.2.3,17.2.3])
[INFO] |  \- com.google.android.gms:play-services-measurement-sdk:aar:17.2.3:compile
[INFO] +- com.google.firebase:firebase-messaging:aar:20.1.7:compile
[INFO] |  +- com.google.android.datatransport:transport-api:aar:2.2.0:compile
[INFO] |  +- com.google.android.datatransport:transport-backend-cct:aar:2.2.0:compile
[INFO] |  +- com.google.android.datatransport:transport-runtime:aar:2.2.0:compile
[INFO] |  |  \- com.google.dagger:dagger:jar:2.24:compile
[INFO] |  |     \- javax.inject:javax.inject:jar:1:compile
[INFO] |  +- com.google.android.gms:play-services-stats:aar:17.0.0:compile
[INFO] |  +- com.google.firebase:firebase-common:aar:19.3.0:compile
[INFO] |  |  \- com.google.auto.value:auto-value-annotations:jar:1.6.5:compile
[INFO] |  +- com.google.firebase:firebase-components:aar:16.0.0:compile
[INFO] |  +- com.google.firebase:firebase-datatransport:aar:17.0.3:compile
[INFO] |  +- com.google.firebase:firebase-encoders-json:aar:16.0.0:compile
[INFO] |  +- com.google.firebase:firebase-iid:aar:20.1.7:compile (version selected from constraint [20.1.7,20.1.7])
[INFO] |  |  \- com.google.firebase:firebase-iid-interop:aar:17.0.0:compile
[INFO] |  +- com.google.firebase:firebase-installations:aar:16.3.0:compile
[INFO] |  +- com.google.firebase:firebase-installations-interop:aar:16.0.0:compile
[INFO] |  \- com.google.firebase:firebase-measurement-connector:aar:18.0.0:compile
[INFO] +- com.squareup.okhttp3:okhttp-urlconnection:jar:3.10.0:compile
[INFO] |  \- com.squareup.okhttp3:okhttp:jar:3.10.0:compile
[INFO] |     \- com.squareup.okio:okio:jar:1.14.0:compile
[INFO] +- me.leolin:ShortcutBadger:aar:1.1.22:compile
[INFO] \- com.android.support:appcompat-v7:aar:23.4.0:compile
[INFO]    +- com.android.support:animated-vector-drawable:aar:23.4.0:compile
[INFO]    +- com.android.support:support-v4:aar:23.4.0:compile
[INFO]    |  \- com.android.support:support-annotations:jar:23.4.0:compile
[INFO]    \- com.android.support:support-vector-drawable:aar:23.4.0:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
}}}

== Copy dependencies ==
 * mvn dependency:copy-dependencies --log-file out1copydep.txt
 * check folder target/dependencies
 * split --verbose -b4096K deps2.zip deps2.zip.
 * cat deps2.zip.?? > zip2.new
 * unzip -t zip2.new

== FAT Jar Java 1.7 ==
 * mvn clean install

=== pom.xml ===
{{{#!highlight xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
        http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>artifactX</artifactId>
    <packaging>jar</packaging>
    <version>0.0.1</version>
    <name>artifactX</name>
    <url>http://maven.apache.org</url>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <descriptorRefs>
                         <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>hello.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> 
                        <phase>package</phase> 
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.7</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.7</version>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>
</project>
}}}

=== src/main/java/hello/Main.java ===
{{{#!highlight java 
package hello;
import java.util.Date;
import java.text.SimpleDateFormat;

class Main {  
  public static void main(String args[]) { 
    Date d = new Date();  
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:MM");
    System.out.println("Hello, world! " + sdf.format(d) ); 
  } 
}
}}}