## 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
org.jboss.resteasy
resteasy-jaxrs
2.2.1.GA
provided
javax
javaee-web-api
6.0
provided
}}}
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("
Hello World!");
out.println(String.format("Hello World! %s
",text));
}
}
}}}
Dependency for JAR that has IWSTest interface that WSTest EJB implements:
{{{#!highlight xml
org.allowed.bitarus
test2
0.0.1
}}}
=== Configure web app ===
File src/main/webapp/WEB-INF/web.xml
{{{#!highlight xml
Archetype Created Web Application
resteasy.scan
true
resteasy.servlet.mapping.prefix
/rest
resteasy-servlet
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
resteasy-servlet
/rest/*
Servletx
org.allowed.bitarus.Servletx
Servletx
/servletxxx
}}}
== 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
4.0.0
org.allowed.bitarus
test2
0.0.1
ejb
ejbModule
ejbModule
**/*.java
maven-ejb-plugin
2.3
3.0
javax.ejb
ejb-api
3.0
sun-jaxws
jsr181-api
1.0
javaee
javaee-api
5
}}}
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 list = new ArrayList();
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
OracleDS
jdbc:oracle:thin:@localhost:1521:xe
oracle.jdbc.driver.OracleDriver
SYSTEM
jboss
org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
Oracle9i
}}}
=== 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
MysqlDS
jdbc:mysql://localhost:3306/mysql
com.mysql.jdbc.Driver
root
12345678
org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker
mySQL
}}}
== 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
{{{
maven-assembly-plugin
2.4
jar-with-dependencies
}}}
== Standalone app ==
pom.xml
{{{
4.0.0
com.example
artifactX
jar
0.0.1
artifactX
http://maven.apache.org
maven-assembly-plugin
2.4
jar-with-dependencies
com.example.Main
make-assembly
package
single
com.google.code.gson
gson
2.3
mysql
mysql-connector-java
5.1.31
compile
org.slf4j
slf4j-api
1.7.7
org.slf4j
slf4j-simple
1.7.7
}}}
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= -DgroupId= -DartifactId= -Dversion= -Dpackaging=
}}}
{{{
mvn install:install-file -DgroupId=com.sun -DartifactId=tools -Dversion=1.4.2 -Dpackaging=jar -Dfile=C:\temp\test\tools.jar”
}}}
Dependency:
{{{
com.sun
tools
1.4.2
}}}