Upload
mu-chun-wang
View
937
Download
0
Embed Size (px)
DESCRIPTION
Citation preview
Using Maven to build Java & Android program
Kewang
2
Install Maven
● Download from [HERE](http://maven.apache.org/download.cgi)– Or apt-get / yum / brew ......
● Add env.– M2_HOME=/opt/maven– M2=$M2_HOME/bin
● Run mvn --version– verify mvn is installed correctly.
3
About me
● 王慕羣 (Kewang)● Skills
– Android– AWS (EC2, S3, DynamoDB)– Hadoop (HBase, MapReduce)– Node.js, Rails
● Company– Mitake Inc.
● Others– Google Play, GitHub, slideshare, Scribd
Maven
5
Maven's objectives
● Making the build process easy● Providing a uniform build system● Providing quality project information● Providing guidelines for best practices development● Allowing transparent migration to new features
6
Maven can manage ...
● Builds● Documentation● Reporting● Dependencies● SCMs● Releases● Distribution
7
Maven's concepts
● Project Object Model● Convention over Configuration (CoC)● Dependency management● Plugin-based architecture
8
Project Object Model
9
Project Object Model
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>my-app</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies></project>
10
Convention over Configuration
11
Convention over Configuration
<sourceDirectory>/tmp/tts/src</sourceDirectory><scriptSourceDirectory>/tmp/tts/src/main/scripts</scriptSourceDirectory><testSourceDirectory>/tmp/tts/src/test/java</testSourceDirectory><outputDirectory>/tmp/tts/target/classes</outputDirectory><testOutputDirectory>/tmp/tts/target/test-classes</testOutputDirectory><resources> <resource> <directory>/tmp/tts/src/main/resources</directory> </resource></resources><testResources> <testResource> <directory>/tmp/tts/src/test/resources</directory> </testResource></testResources>
mvn help:effective-pom
12
Convention over Configuration
<sourceDirectory>/tmp/tts/src</sourceDirectory><scriptSourceDirectory>/tmp/tts/src/main/scripts</scriptSourceDirectory><testSourceDirectory>/tmp/tts/src/test/java</testSourceDirectory><outputDirectory>/tmp/tts/target/classes</outputDirectory><testOutputDirectory>/tmp/tts/target/test-classes</testOutputDirectory><resources> <resource> <directory>/tmp/tts/src/main/resources</directory> </resource></resources><testResources> <testResource> <directory>/tmp/tts/src/test/resources</directory> </testResource></testResources>
mvn help:effective-pom
13
Dependency management
14
Dependency management
<dependencies> <dependency> <groupId>android</groupId> <artifactId>android</artifactId> <version>2.3.3_r2</version> <scope>provided</scope> </dependency></dependencies>
15
Dependency management
<dependencies> <dependency> <groupId>android</groupId> <artifactId>android</artifactId> <version>2.3.3_r2</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.squareup.picasso</groupId> <artifactId>picasso</artifactId> <version>2.2.0</version> </dependency></dependencies>
16
Plugin-based architecture
17
Plugin-based architecture
<plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <mainClass>com.mycompany.example.App</mainClass> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin></plugins>
Maven lifecycle & commands
19
Maven lifecycle
20
Maven commands
● mvn clean– Remove all previous build generated files.
● mvn compile– Compile the source code of the project.
● mvn test– Run tests using a suitable unit testing framework.
● mvn package– Package compiled code to distributable format.
● mvn install– Install the package into the local repository.
● mvn deploy– Copy the final package to the remote repository.
Build a simple Java project
22
Step by step
● Normalize directory structure● Write pom.xml● Run it
23
Normalize directory structure
24
Or maven-archetype-quickstart
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
25
Write pom.xml
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>my-app</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies></project>
26
mvn clean compile
27
mvn clean compile
only compiled class
28
mvn clean package
29
mvn clean package
include test file, jar file...
but it can't run ...
31
mvn clean compile exec:java
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <mainClass>com.mycompany.example.App</mainClass> </configuration> </plugin> </plugins></build>
32
mvn clean compile exec:java
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <mainClass>com.mycompany.example.App</mainClass> </configuration> </plugin> </plugins></build>
remember assign <mainClass/>
Live DEMO
Apply Maven to Android
35
Project directory structure
36
Step by step
● Install Android SDK● Run Maven Android SDK Deployer● Write pom.xml● Run it
37
Install Android SDK, at least ...
● All versions SDK Platform● All versions Google APIs● All Extra items (including obsoleted)● Glass Development Kit Sneak Peek
38
Run Maven Android SDK Deployer
● Checkout mosabua/maven-android-sdk-deployer● mvn install
39
Run Maven Android SDK Deployer
● Checkout mosabua/maven-android-sdk-deployer● mvn install
copy all jar files to maven repository
40
Use Android libraries like ...
<dependency> <groupId>android</groupId> <artifactId>android</artifactId> <version>4.4_r1</version> <scope>provided</scope></dependency>
41
Use Android libraries like ...
<dependency> <groupId>android</groupId> <artifactId>android</artifactId> <version>4.4_r1</version> <scope>provided</scope></dependency>
"provided" stands for only compile, not package itself
42
Use Android libraries like ...
<dependency> <groupId>com.google.android.maps</groupId> <artifactId>maps</artifactId> <version>19_r1</version> <scope>provided</scope></dependency>
43
Use Android libraries like ...
<dependency> <groupId>android.support</groupId> <artifactId>compatibility-v13</artifactId> <version>19.0.1</version></dependency>
Write pom.xml
45
<project> tags
<packaging>apk</packaging>
46
<dependencies> tags
<dependency> <groupId>android</groupId> <artifactId>android</artifactId> <version>4.0_r3</version> <scope>provided</scope></dependency><dependency> <groupId>android.support</groupId> <artifactId>compatibility-v4</artifactId> <version>19.0.1</version></dependency>
47
<plugins> tags
<plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId> <version>3.8.1</version> <extensions>true</extensions> <configuration> <sdk> <platform>14</platform> </sdk> </configuration></plugin>
48
mvn clean package
49
mvn clean package
generates R.java
50
mvn android:deploy android:run
● mvn android:deploy– Install app to device
● mvn android:run– Run app at device
Live DEMO
52
android-maven-plugin FAQ
53
android-maven-plugin FAQ
● No Android SDK path could be found.
54
android-maven-plugin FAQ
● No Android SDK path could be found.– no ANDROID_HOME env., or value is incorrect
● set ANDROID_HOME env. to Android SDK path
55
android-maven-plugin FAQ
● No Android SDK path could be found.– no ANDROID_HOME env., or value is incorrect
● set ANDROID_HOME env. to Android SDK path
● Unknown packaging: apk
56
android-maven-plugin FAQ
● No Android SDK path could be found.– no ANDROID_HOME env., or value is incorrect
● set ANDROID_HOME env. to Android SDK path
● Unknown packaging: apk– no extensions tag, or value is not "true"
● <extensions>true</extensions>
57
android-maven-plugin FAQ
● No Android SDK path could be found.– no ANDROID_HOME env., or value is incorrect
● set ANDROID_HOME env. to Android SDK path
● Unknown packaging: apk– no extensions tag, or value is not "true"
● <extensions>true</extensions>
● package R does not exist
58
android-maven-plugin FAQ
● No Android SDK path could be found.– no ANDROID_HOME env., or value is incorrect
● set ANDROID_HOME env. to Android SDK path
● Unknown packaging: apk– no extensions tag, or value is not "true"
● <extensions>true</extensions>
● package R does not exist– <packaging>jar</packaging>
● <packaging>apk</packaging>
59
android-maven-plugin FAQ
● No Android SDK path could be found.– no ANDROID_HOME env., or value is incorrect
● set ANDROID_HOME env. to Android SDK path
● Unknown packaging: apk– no extensions tag, or value is not "true"
● <extensions>true</extensions>
● package R does not exist– <packaging>jar</packaging>
● <packaging>apk</packaging>
● Ill-advised or mistaken usage of a core class
60
android-maven-plugin FAQ
● No Android SDK path could be found.– no ANDROID_HOME env., or value is incorrect
● set ANDROID_HOME env. to Android SDK path
● Unknown packaging: apk– no extensions tag, or value is not "true"
● <extensions>true</extensions>
● package R does not exist– <packaging>jar</packaging>
● <packaging>apk</packaging>
● Ill-advised or mistaken usage of a core class– no scope tag, or value is not "provided"
● <scope>provided</scope>
Eclipse tipsIMPORTANT !!!
62
Tips - How to use src folder ?
63
Tips - How to use src folder ?
<build> <sourceDirectory>src</sourceDirectory></build>
64
Tips - How to use libs folder ?
65
Tips - How to use libs folder ?
● mvn install:install-file– -Dfile=<path-to-file>– -DgroupId=<group-id>– -DartifactId=<artifact-id>– -Dversion=<version>– -Dpackaging=jar
66
Tips - How to use libs folder ?
● mvn install:install-file– -Dfile=<path-to-file>– -DgroupId=<group-id>– -DartifactId=<artifact-id>– -Dversion=<version>– -Dpackaging=jar
● mvn install:install-file -Dfile=flappybird.jar -DgroupId=tw.kewang -DartifactId=flappybird -Dversion=1.0 -Dpackaging=jar
67
Tips - How to use libs folder ?
● mvn install:install-file– -Dfile=<path-to-file>– -DgroupId=<group-id>– -DartifactId=<artifact-id>– -Dversion=<version>– -Dpackaging=jar
● mvn install:install-file -Dfile=flappybird.jar -DgroupId=tw.kewang -DartifactId=flappybird -Dversion=1.0 -Dpackaging=jar
copy jar file to maven repository
68
Tips - How to use gen folder ?
69
Tips - How to use gen folder ?<plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId> <configuration> <genDirectory>gen</genDirectory> </configuration></plugin>
70
Tips - How to use gen folder ?<plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId> <configuration> <genDirectory>gen</genDirectory> </configuration></plugin>
<plugin> <artifactId>maven-clean-plugin</artifactId> <version>2.5</version> <configuration> <filesets> <fileset> <directory>gen</directory> </fileset> </filesets> </configuration></plugin>
71
Tips - How to use gen folder ?<plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId> <configuration> <genDirectory>gen</genDirectory> </configuration></plugin>
<plugin> <artifactId>maven-clean-plugin</artifactId> <version>2.5</version> <configuration> <filesets> <fileset> <directory>gen</directory> </fileset> </filesets> </configuration></plugin>
remember clean gen folder
72
Tips - How to clean bin folder ?
<plugin> <artifactId>maven-clean-plugin</artifactId> <version>2.5</version> <configuration> <filesets> <fileset> <directory>bin</directory> </fileset> </filesets> </configuration></plugin>
73
Tips - How to use library project ?
74
Tips - How to use library project ?
● Write pom.xml at library project as general Android project
75
Tips - How to use library project ?
● Write pom.xml at library project as general Android project
● mvn clean android:apklib– Apklib file includes src/main/java, libs & res directory
76
Tips - How to use library project ?
● Write pom.xml at library project as general Android project
● mvn clean android:apklib– Apklib file includes src/main/java, libs & res directory
● Use install goal to copy apklib to maven repository
77
Tips - How to use library project ?
● Write pom.xml at library project as general Android project
● mvn clean android:apklib– Apklib file includes src/main/java, libs & res directory
● Use install goal to copy apklib to maven repository● Add dependency at main project
<dependency> <groupId>tw.kewang.ui.captchaview</groupId> <artifactId>CaptchaView</artifactId> <version>1.0.0</version> <type>apklib</type></dependency>
78
Tips - How to use non-maven library ?
● Compress non-maven library to zip file
79
Tips - How to use non-maven library ?
● Compress non-maven library to zip file● Use install goal to copy zip to maven repository
– packaging=apklib
80
Tips - How to use non-maven library ?
● Compress non-maven library to zip file● Use install goal to copy zip to maven repository
– packaging=apklib● Add dependency at main project
<dependency> <groupId>tw.kewang.ui.captchaview</groupId> <artifactId>CaptchaView</artifactId> <version>1.0.0</version> <type>apklib</type></dependency>
Show Timegithub://kewangtw
82
Show Time - google-tts
tts.say(sentence, true, new OnFinishListener() { @Override public void onFinish() { Toast.makeText(this, sentence, Toast.LENGTH_SHORT).show(); }});
83
Show Time - map-controller
mc.startTrackMyLocation(new ChangeMyLocation() { @Override public void changed(GoogleMap map, Location location) { Log.d("TRACK", location.toString()); }});
mc.whenMapClick(new ClickCallback() { @Override public void clicked(GoogleMap map, LatLng latLng) { Log.d("CLICK", latLng.toString()); }});
84
Show Time - CaptchaView
captcha.setPattern("1234567890");captcha.setLength(6);captcha.refresh();
if (captcha.getCaptcha().equals(check)) { Log.d("CAPTCHA", "Success");} else { Log.d("CAPTCHA", "Fail");}
85
Show Time - tile<tw.kewang.tile.Tile> <tw.kewang.tile.TileGroup tile:maxCells="3" tile:x="450dp" tile:y="50dp" > <tw.kewang.tile.TileCell tile:x="50dp" tile:y="50dp" /> <tw.kewang.tile.TileCell tile:x="100dp" tile:y="150dp" /> </tw.kewang.tile.TileGroup></tw.kewang.tile.Tile>
tile2.setOnCellLongClickListener(new OnLongClickListener() { @Override public void onLongClick(TileGroup group, TileCell cell) { tile2.startDrag(); }});
86
References
● Apache Maven Project● Android Application Development with Maven● Android Maven Plugin● Maven Android SDK Deployer
87