You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2019/12/25 03:32:40 UTC

[commons-vfs] annotated tag japicmp-base-0.0.2 created (now 4182885)

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a change to annotated tag japicmp-base-0.0.2
in repository https://gitbox.apache.org/repos/asf/commons-vfs.git.


      at 4182885  (tag)
 tagging f21e23893e90e0735c24425341995f3153a37297 (commit)
 replaces japicmp-base-0.0.1
      by siom79
      on Sun Oct 6 11:42:52 2013 +0200

- Log -----------------------------------------------------------------
[maven-release-plugin]  copy for tag japicmp-base-0.0.2
-----------------------------------------------------------------------

This annotated tag includes the following new commits:

     new aceff7a  Initial commit
     new 0ed6bdc  Initial commit
     new 846a435  Updated pom.xml and README.md
     new 878c163  changed logging level to INFO
     new d702fd6  added findbugs plugin
     new ca83540  Updated download link to newest snapshot version
     new dffbb39  moved distribution management to base pom
     new d135151  added testbase module and three submodules to test the comparison of jar archives
     new 80d2a73  further test cases
     new 645e7aa  extended README.md
     new ef67f5f  Added JarArchiveComparatorOptions, Update of README.md
     new af0ec12  [maven-release-plugin] prepare release japicmp-base-0.0.1
     new 8912361  [maven-release-plugin] rollback the release of japicmp-base-0.0.1
     new 41c5647  [maven-release-plugin] prepare release japicmp-base-0.0.1
     new ff15256  [maven-release-plugin] rollback the release of japicmp-base-0.0.1
     new 7fe97d4  [maven-release-plugin] prepare release japicmp-base-0.0.1
     new 8fbdc6c  [maven-release-plugin] rollback the release of japicmp-base-0.0.1
     new 94e66eb  [maven-release-plugin] prepare release japicmp-base-0.0.1
     new 3eeaf9c  [maven-release-plugin] prepare for next development iteration
     new 6c1a401  Updated README.md
     new 53a32f8  added -a option that lets the user specify the access modifier level used to compare classes and class members
     new 0111134  added new feature package filter (new cli option)
     new 7c22f30  added xml output for cobertura plugin
     new 3d58ae7  it is verified that argument for cli option -o and -n is a jar file
     new 329ab85  updated README.md
     new f5b13eb  updated README.md
     new f21e238  [maven-release-plugin] prepare release japicmp-base-0.0.2

The 27 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[commons-vfs] 08/09: updated README.md

Posted by gg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to annotated tag japicmp-base-0.0.2
in repository https://gitbox.apache.org/repos/asf/commons-vfs.git

commit f5b13eb2784c47374457432aa20ce16ddfcbd0c7
Author: siom79 <ma...@googlemail.com>
AuthorDate: Sun Oct 6 11:37:36 2013 +0200

    updated README.md
---
 README.md | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/README.md b/README.md
index b1aae7e..b790969 100644
--- a/README.md
+++ b/README.md
@@ -71,6 +71,23 @@ In the following you see the beginning of the xml output file after having compu
         </class>
 		...
 
+The differences between the two Java APIs are also printed on the command line for a quick overview:
+
+    --- REMOVED ANNOTATION org.apache.http.annotation.GuardedBy
+        --- REMOVED METHOD value()
+    --- REMOVED ANNOTATION org.apache.http.annotation.Immutable
+    --- REMOVED ANNOTATION org.apache.http.annotation.NotThreadSafe
+    --- REMOVED ANNOTATION org.apache.http.annotation.ThreadSafe
+    === UNCHANGED CLASS org.apache.http.auth.AUTH
+    === UNCHANGED CLASS org.apache.http.auth.AuthenticationException
+    +++ NEW CLASS org.apache.http.auth.AuthOption
+        +++ NEW METHOD getAuthScheme()
+        +++ NEW METHOD getCredentials()
+        +++ NEW METHOD toString()
+    +++ NEW ENUM org.apache.http.auth.AuthProtocolState
+        +++ NEW METHOD valueOf(java.lang.String)
+        +++ NEW METHOD values()
+
 ##Downloads##
 
 The following releases are available:


[commons-vfs] 09/09: [maven-release-plugin] prepare release japicmp-base-0.0.2

Posted by gg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to annotated tag japicmp-base-0.0.2
in repository https://gitbox.apache.org/repos/asf/commons-vfs.git

commit f21e23893e90e0735c24425341995f3153a37297
Author: siom79 <ma...@googlemail.com>
AuthorDate: Sun Oct 6 11:42:46 2013 +0200

    [maven-release-plugin] prepare release japicmp-base-0.0.2
---
 japicmp-testbase/japicmp-test-v1/pom.xml | 2 +-
 japicmp-testbase/japicmp-test-v2/pom.xml | 2 +-
 japicmp-testbase/japicmp-test/pom.xml    | 2 +-
 japicmp-testbase/pom.xml                 | 2 +-
 japicmp/pom.xml                          | 2 +-
 pom.xml                                  | 7 +++----
 6 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/japicmp-testbase/japicmp-test-v1/pom.xml b/japicmp-testbase/japicmp-test-v1/pom.xml
index 3762fa5..c1c4437 100644
--- a/japicmp-testbase/japicmp-test-v1/pom.xml
+++ b/japicmp-testbase/japicmp-test-v1/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>japicmp</groupId>
         <artifactId>japicmp-testbase</artifactId>
-        <version>0.0.2-SNAPSHOT</version>
+        <version>0.0.2</version>
     </parent>
 
     <artifactId>japicmp-test-v1</artifactId>
diff --git a/japicmp-testbase/japicmp-test-v2/pom.xml b/japicmp-testbase/japicmp-test-v2/pom.xml
index 98878c6..d28f988 100644
--- a/japicmp-testbase/japicmp-test-v2/pom.xml
+++ b/japicmp-testbase/japicmp-test-v2/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>japicmp</groupId>
         <artifactId>japicmp-testbase</artifactId>
-        <version>0.0.2-SNAPSHOT</version>
+        <version>0.0.2</version>
     </parent>
 
     <artifactId>japicmp-test-v2</artifactId>
diff --git a/japicmp-testbase/japicmp-test/pom.xml b/japicmp-testbase/japicmp-test/pom.xml
index 309a32f..e144e25 100644
--- a/japicmp-testbase/japicmp-test/pom.xml
+++ b/japicmp-testbase/japicmp-test/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>japicmp</groupId>
         <artifactId>japicmp-testbase</artifactId>
-        <version>0.0.2-SNAPSHOT</version>
+        <version>0.0.2</version>
     </parent>
 
     <artifactId>japicmp-test</artifactId>
diff --git a/japicmp-testbase/pom.xml b/japicmp-testbase/pom.xml
index a5a62e7..d96866b 100644
--- a/japicmp-testbase/pom.xml
+++ b/japicmp-testbase/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>japicmp</groupId>
         <artifactId>japicmp-base</artifactId>
-        <version>0.0.2-SNAPSHOT</version>
+        <version>0.0.2</version>
     </parent>
 
     <artifactId>japicmp-testbase</artifactId>
diff --git a/japicmp/pom.xml b/japicmp/pom.xml
index 76844b6..13143ae 100644
--- a/japicmp/pom.xml
+++ b/japicmp/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>japicmp</groupId>
         <artifactId>japicmp-base</artifactId>
-        <version>0.0.2-SNAPSHOT</version>
+        <version>0.0.2</version>
     </parent>
 
     <artifactId>japicmp</artifactId>
diff --git a/pom.xml b/pom.xml
index 38aa448..96d3cd2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,11 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<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">
+<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>japicmp</groupId>
     <artifactId>japicmp-base</artifactId>
-    <version>0.0.2-SNAPSHOT</version>
+    <version>0.0.2</version>
     <packaging>pom</packaging>
 
     <properties>
@@ -123,7 +122,7 @@
         <connection>scm:git:git://github.com/${github.account}/${project.groupId}.git</connection>
         <developerConnection>scm:git:git@github.com:${github.account}/${project.groupId}.git</developerConnection>
         <url>http://github.com/${github.account}/${project.groupId}/tree/master/</url>
-        <tag>HEAD</tag>
+        <tag>japicmp-base-0.0.2</tag>
     </scm>
 
     <distributionManagement>


[commons-vfs] 05/09: added xml output for cobertura plugin

Posted by gg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to annotated tag japicmp-base-0.0.2
in repository https://gitbox.apache.org/repos/asf/commons-vfs.git

commit 7c22f30a3017a14911aceec08204d93c182f30d8
Author: siom79 <ma...@googlemail.com>
AuthorDate: Sat Oct 5 19:49:46 2013 +0200

    added xml output for cobertura plugin
---
 pom.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/pom.xml b/pom.xml
index 27bdf0e..38aa448 100644
--- a/pom.xml
+++ b/pom.xml
@@ -102,6 +102,7 @@
                     <configuration>
                         <formats>
                             <format>html</format>
+                            <format>xml</format>
                         </formats>
                     </configuration>
                     <executions>


[commons-vfs] 06/09: it is verified that argument for cli option -o and -n is a jar file

Posted by gg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to annotated tag japicmp-base-0.0.2
in repository https://gitbox.apache.org/repos/asf/commons-vfs.git

commit 3d58ae7ba59656cd20ccee825c2957126c6917af
Author: siom79 <ma...@googlemail.com>
AuthorDate: Sun Oct 6 11:29:30 2013 +0200

    it is verified that argument for cli option -o and -n is a jar file
---
 japicmp/src/main/java/japicmp/JApiCmp.java | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/japicmp/src/main/java/japicmp/JApiCmp.java b/japicmp/src/main/java/japicmp/JApiCmp.java
index 14a59ec..bcb684d 100644
--- a/japicmp/src/main/java/japicmp/JApiCmp.java
+++ b/japicmp/src/main/java/japicmp/JApiCmp.java
@@ -11,7 +11,9 @@ import japicmp.output.stdout.StdoutOutputGenerator;
 import japicmp.output.xml.XmlOutputGenerator;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.List;
+import java.util.jar.JarFile;
 
 public class JApiCmp {
 
@@ -34,7 +36,7 @@ public class JApiCmp {
         Options options = parseCliOptions(args);
         File oldArchive = new File(options.getOldArchive());
         File newArchive = new File(options.getNewArchive());
-        verifyFilesExist(oldArchive, newArchive);
+        verifyFiles(oldArchive, newArchive);
         JarArchiveComparatorOptions comparatorOptions = new JarArchiveComparatorOptions();
         copyOptions(options, comparatorOptions);
         JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(comparatorOptions);
@@ -70,7 +72,7 @@ public class JApiCmp {
         }
     }
 
-    private void verifyFilesExist(File oldArchive, File newArchive) {
+    private void verifyFiles(File oldArchive, File newArchive) {
         if (!oldArchive.exists()) {
             String msg = String.format("File '%s' does not exist.", oldArchive.getAbsolutePath());
             throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
@@ -83,5 +85,16 @@ public class JApiCmp {
             String msg = String.format("Files '%s' and '%s' are the same.", oldArchive.getAbsolutePath(), newArchive.getAbsolutePath());
             throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
         }
+        verifyJarArchive(oldArchive);
+        verifyJarArchive(newArchive);
+    }
+
+    private void verifyJarArchive(File file) {
+        try {
+            new JarFile(file);
+        } catch (IOException e) {
+            String msg = String.format("File '%s' could not be opened as a jar file: %s", file.getAbsolutePath(), e.getMessage());
+            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
+        }
     }
 }


[commons-vfs] 01/09: [maven-release-plugin] prepare for next development iteration

Posted by gg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to annotated tag japicmp-base-0.0.2
in repository https://gitbox.apache.org/repos/asf/commons-vfs.git

commit 3eeaf9c9fe3f3eead40dea35b6062b6297fc9bd3
Author: siom79 <ma...@googlemail.com>
AuthorDate: Thu Oct 3 13:35:19 2013 +0200

    [maven-release-plugin] prepare for next development iteration
---
 japicmp-testbase/japicmp-test-v1/pom.xml | 2 +-
 japicmp-testbase/japicmp-test-v2/pom.xml | 2 +-
 japicmp-testbase/japicmp-test/pom.xml    | 2 +-
 japicmp-testbase/pom.xml                 | 2 +-
 japicmp/pom.xml                          | 2 +-
 pom.xml                                  | 4 ++--
 6 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/japicmp-testbase/japicmp-test-v1/pom.xml b/japicmp-testbase/japicmp-test-v1/pom.xml
index ef2c7cd..3762fa5 100644
--- a/japicmp-testbase/japicmp-test-v1/pom.xml
+++ b/japicmp-testbase/japicmp-test-v1/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>japicmp</groupId>
         <artifactId>japicmp-testbase</artifactId>
-        <version>0.0.1</version>
+        <version>0.0.2-SNAPSHOT</version>
     </parent>
 
     <artifactId>japicmp-test-v1</artifactId>
diff --git a/japicmp-testbase/japicmp-test-v2/pom.xml b/japicmp-testbase/japicmp-test-v2/pom.xml
index 50386ce..98878c6 100644
--- a/japicmp-testbase/japicmp-test-v2/pom.xml
+++ b/japicmp-testbase/japicmp-test-v2/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>japicmp</groupId>
         <artifactId>japicmp-testbase</artifactId>
-        <version>0.0.1</version>
+        <version>0.0.2-SNAPSHOT</version>
     </parent>
 
     <artifactId>japicmp-test-v2</artifactId>
diff --git a/japicmp-testbase/japicmp-test/pom.xml b/japicmp-testbase/japicmp-test/pom.xml
index d3983ab..5507774 100644
--- a/japicmp-testbase/japicmp-test/pom.xml
+++ b/japicmp-testbase/japicmp-test/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>japicmp</groupId>
         <artifactId>japicmp-testbase</artifactId>
-        <version>0.0.1</version>
+        <version>0.0.2-SNAPSHOT</version>
     </parent>
 
     <artifactId>japicmp-test</artifactId>
diff --git a/japicmp-testbase/pom.xml b/japicmp-testbase/pom.xml
index d3fe934..a5a62e7 100644
--- a/japicmp-testbase/pom.xml
+++ b/japicmp-testbase/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>japicmp</groupId>
         <artifactId>japicmp-base</artifactId>
-        <version>0.0.1</version>
+        <version>0.0.2-SNAPSHOT</version>
     </parent>
 
     <artifactId>japicmp-testbase</artifactId>
diff --git a/japicmp/pom.xml b/japicmp/pom.xml
index 98a43d7..e6725b0 100644
--- a/japicmp/pom.xml
+++ b/japicmp/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>japicmp</groupId>
         <artifactId>japicmp-base</artifactId>
-        <version>0.0.1</version>
+        <version>0.0.2-SNAPSHOT</version>
     </parent>
 
     <artifactId>japicmp</artifactId>
diff --git a/pom.xml b/pom.xml
index 8445e98..6b07683 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
 
     <groupId>japicmp</groupId>
     <artifactId>japicmp-base</artifactId>
-    <version>0.0.1</version>
+    <version>0.0.2-SNAPSHOT</version>
     <packaging>pom</packaging>
 
     <properties>
@@ -98,7 +98,7 @@
         <connection>scm:git:git://github.com/${github.account}/${project.groupId}.git</connection>
         <developerConnection>scm:git:git@github.com:${github.account}/${project.groupId}.git</developerConnection>
         <url>http://github.com/${github.account}/${project.groupId}/tree/master/</url>
-        <tag>japicmp-base-0.0.1</tag>
+        <tag>HEAD</tag>
     </scm>
 	
     <distributionManagement>


[commons-vfs] 04/09: added new feature package filter (new cli option)

Posted by gg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to annotated tag japicmp-base-0.0.2
in repository https://gitbox.apache.org/repos/asf/commons-vfs.git

commit 011113427ed30cf63447258f73e284da34d9ea56
Author: siom79 <ma...@googlemail.com>
AuthorDate: Sat Oct 5 19:36:36 2013 +0200

    added new feature package filter (new cli option)
---
 README.md                                          |  5 +-
 .../java/japicmp/test/packageOne/PackageOne.java   |  4 +
 .../java/japicmp/test/packageTwo/PackageTwo.java   |  4 +
 .../java/japicmp/test/packageOne/PackageOne.java   |  4 +
 .../java/japicmp/test/packageTwo/PackageTwo.java   |  4 +
 japicmp-testbase/japicmp-test/pom.xml              |  4 +
 .../src/test/java/japicmp/test/BasicTest.java      |  2 +-
 .../test/java/japicmp/test/PackageFilterTest.java  | 96 ++++++++++++++++++++++
 japicmp/pom.xml                                    | 15 ----
 japicmp/src/main/java/japicmp/JApiCmp.java         | 53 ++++++++----
 japicmp/src/main/java/japicmp/cli/CliParser.java   | 54 +++++++++---
 .../java/japicmp/cmp/JarArchiveComparator.java     | 22 ++++-
 .../japicmp/cmp/JarArchiveComparatorOptions.java   |  8 +-
 .../src/main/java/japicmp/cmp/PackageFilter.java   | 18 ++++
 japicmp/src/main/java/japicmp/config/Options.java  | 24 ++++--
 .../java/japicmp/exception/JApiCmpException.java   | 22 +++++
 .../test/java/japicmp/cmp/PackageFilterTest.java   | 44 ++++++++++
 pom.xml                                            | 40 +++++++--
 18 files changed, 362 insertions(+), 61 deletions(-)

diff --git a/README.md b/README.md
index 27f33b2..445b87b 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ japicmp is a tool to compare two versions of a jar archive:
 
     java -jar japicmp-0.0.1.jar -n new-version.jar -o old-version.jar
 
-It can also be used as a library to integrate its functionality in some other kind of software:
+It can also be used as a library:
 
 	JarArchiveComparator jarArchiveComparator = new JarArchiveComparator();
     List<JApiClass> jApiClasses = jarArchiveComparator.compare(oldArchive, newArchive);
@@ -29,6 +29,7 @@ library to inspect the class files. This way you only have to provide the two ja
 * Differences can optionally be printed to an xml file. This can be transformed to an HTML file using XSLT.
 * Per default only public classes and class members are compared. If necessary, the access modifier of the classes and class members to be
   compared can be set to package, protected or private.
+* Per default classes from all packages are compared. If necessary, certain packages can be excluded or only specific packages can be included.
 
 ##Usage##
 
@@ -39,6 +40,8 @@ The tool has a set of CLI parameters that are described in the following:
     -n <pathToNewVersionJar>  Provides the path to the new version of the jar.
     -x <pathToXmlOutputFile>  Provides the path to the xml output file. If not given, stdout is used.
     -a <accessModifier>       Sets the access modifier level (public, package, protected, private), which should be used.
+    -i <packagesToInclude>    Comma separated list of package names to include, * can be used as wildcard.
+    -e <packagesToExclude>    Comma separated list of package names to exclude, * can be used as wildcard.
     -m                        Outputs only modified classes/methods. If not given, all classes and methods are printed.
 	
 ###Example###
diff --git a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageOne/PackageOne.java b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageOne/PackageOne.java
new file mode 100644
index 0000000..de59dc7
--- /dev/null
+++ b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageOne/PackageOne.java
@@ -0,0 +1,4 @@
+package japicmp.test.packageOne;
+
+public class PackageOne {
+}
diff --git a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageTwo/PackageTwo.java b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageTwo/PackageTwo.java
new file mode 100644
index 0000000..1ac7fef
--- /dev/null
+++ b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageTwo/PackageTwo.java
@@ -0,0 +1,4 @@
+package japicmp.test.packageTwo;
+
+public class PackageTwo {
+}
diff --git a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageOne/PackageOne.java b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageOne/PackageOne.java
new file mode 100644
index 0000000..de59dc7
--- /dev/null
+++ b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageOne/PackageOne.java
@@ -0,0 +1,4 @@
+package japicmp.test.packageOne;
+
+public class PackageOne {
+}
diff --git a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageTwo/PackageTwo.java b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageTwo/PackageTwo.java
new file mode 100644
index 0000000..1ac7fef
--- /dev/null
+++ b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageTwo/PackageTwo.java
@@ -0,0 +1,4 @@
+package japicmp.test.packageTwo;
+
+public class PackageTwo {
+}
diff --git a/japicmp-testbase/japicmp-test/pom.xml b/japicmp-testbase/japicmp-test/pom.xml
index 5507774..309a32f 100644
--- a/japicmp-testbase/japicmp-test/pom.xml
+++ b/japicmp-testbase/japicmp-test/pom.xml
@@ -64,6 +64,10 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>cobertura-maven-plugin</artifactId>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java
index c02ea3a..11d69a3 100644
--- a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java
+++ b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java
@@ -21,7 +21,7 @@ public class BasicTest {
     public void test() {
         JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(new JarArchiveComparatorOptions());
         List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
-        assertThat(jApiClasses.size(), is(5));
+        assertThat(jApiClasses.size(), is(7));
         JApiClass jApiClassRemoved = getJApiClass(jApiClasses, Removed.class.getName());
         JApiClass jApiClassAdded = getJApiClass(jApiClasses, Added.class.getName());
         JApiClass jApiClassUnchanged = getJApiClass(jApiClasses, Unchanged.class.getName());
diff --git a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/PackageFilterTest.java b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/PackageFilterTest.java
new file mode 100644
index 0000000..7ee3c80
--- /dev/null
+++ b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/PackageFilterTest.java
@@ -0,0 +1,96 @@
+package japicmp.test;
+
+import japicmp.cmp.JarArchiveComparator;
+import japicmp.cmp.JarArchiveComparatorOptions;
+import japicmp.cmp.PackageFilter;
+import japicmp.model.JApiClass;
+import japicmp.test.packageOne.PackageOne;
+import japicmp.test.packageTwo.PackageTwo;
+import org.junit.Test;
+
+import java.util.List;
+
+import static japicmp.test.util.Helper.getArchive;
+import static japicmp.test.util.Helper.getJApiClass;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+public class PackageFilterTest {
+
+    @Test
+    public void onlyIncludeOnePackage() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.getPackagesInclude().add(new PackageFilter("japicmp.test.packageOne"));
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        getJApiClass(jApiClasses, PackageOne.class.getName());
+        assertThat(jApiClasses.size(), is(1));
+    }
+
+    @Test
+    public void onlyIncludeTwoPackages() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.getPackagesInclude().add(new PackageFilter("japicmp.test.packageOne"));
+        options.getPackagesInclude().add(new PackageFilter("japicmp.test.packageTwo"));
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        getJApiClass(jApiClasses, PackageOne.class.getName());
+        getJApiClass(jApiClasses, PackageTwo.class.getName());
+        assertThat(jApiClasses.size(), is(2));
+    }
+
+    @Test
+    public void onlyExcludeOnePackage() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.getPackagesExclude().add(new PackageFilter("japicmp.test.packageOne"));
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        assertThatExceptionIsThrown(new Callback() {
+            public void callback() {
+                getJApiClass(jApiClasses, PackageOne.class.getName());
+            }
+        });
+    }
+
+    @Test
+    public void excludePackageJapicmpTest() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.getPackagesExclude().add(new PackageFilter("japicmp.test"));
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        assertThat(jApiClasses.size(), is(0));
+    }
+
+    @Test
+    public void includePackageJapicmpTest() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.getPackagesInclude().add(new PackageFilter("japicmp.test"));
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        assertThat(getJApiClass(jApiClasses, PackageOne.class.getName()), is(notNullValue()));
+    }
+
+    @Test
+    public void includePackageOneWithWildcard() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.getPackagesInclude().add(new PackageFilter("japicmp.*.packageOne"));
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        assertThat(getJApiClass(jApiClasses, PackageOne.class.getName()), is(notNullValue()));
+    }
+
+    private interface Callback {
+        void callback();
+    }
+
+    private void assertThatExceptionIsThrown(Callback callback) {
+        boolean exception = false;
+        try {
+            callback.callback();
+        } catch (Exception e) {
+            exception = true;
+        }
+        assertThat(exception, is(true));
+    }
+}
diff --git a/japicmp/pom.xml b/japicmp/pom.xml
index e6725b0..76844b6 100644
--- a/japicmp/pom.xml
+++ b/japicmp/pom.xml
@@ -32,21 +32,6 @@
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>cobertura-maven-plugin</artifactId>
-                <version>2.5.2</version>
-                <configuration>
-                    <formats>
-                        <format>html</format>
-                    </formats>
-                </configuration>
-                <executions>
-                    <execution>
-                        <phase>verify</phase>
-                        <goals>
-                            <goal>clean</goal>
-                            <goal>cobertura</goal>
-                        </goals>
-                    </execution>
-                </executions>
             </plugin>
             <plugin>
                 <artifactId>maven-assembly-plugin</artifactId>
diff --git a/japicmp/src/main/java/japicmp/JApiCmp.java b/japicmp/src/main/java/japicmp/JApiCmp.java
index 6d55a17..14a59ec 100644
--- a/japicmp/src/main/java/japicmp/JApiCmp.java
+++ b/japicmp/src/main/java/japicmp/JApiCmp.java
@@ -4,6 +4,7 @@ import japicmp.cli.CliParser;
 import japicmp.cmp.JarArchiveComparator;
 import japicmp.cmp.JarArchiveComparatorOptions;
 import japicmp.config.Options;
+import japicmp.exception.JApiCmpException;
 import japicmp.model.JApiClass;
 import japicmp.output.OutputTransformer;
 import japicmp.output.stdout.StdoutOutputGenerator;
@@ -15,18 +16,41 @@ import java.util.List;
 public class JApiCmp {
 
     public static void main(String[] args) {
+        try {
+            JApiCmp app = new JApiCmp();
+            app.run(args);
+        } catch (JApiCmpException e) {
+            if (e.getReason() != JApiCmpException.Reason.NormalTermination) {
+                System.err.println(e.getMessage());
+                System.exit(-1);
+            }
+        } catch (Exception e) {
+            System.err.println(String.format("Execution of %s failed: %s", JApiCmp.class.getSimpleName(), e.getMessage()));
+            System.exit(-2);
+        }
+    }
+
+    private void run(String[] args) {
         Options options = parseCliOptions(args);
         File oldArchive = new File(options.getOldArchive());
         File newArchive = new File(options.getNewArchive());
         verifyFilesExist(oldArchive, newArchive);
-        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(new JarArchiveComparatorOptions());
+        JarArchiveComparatorOptions comparatorOptions = new JarArchiveComparatorOptions();
+        copyOptions(options, comparatorOptions);
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(comparatorOptions);
         List<JApiClass> jApiClasses = jarArchiveComparator.compare(oldArchive, newArchive);
         generateOutput(options, oldArchive, newArchive, jApiClasses);
     }
 
-    private static void generateOutput(Options options, File oldArchive, File newArchive, List<JApiClass> jApiClasses) {
+    private void copyOptions(Options options, JarArchiveComparatorOptions comparatorOptions) {
+        comparatorOptions.setModifierLevel(options.getAccessModifier());
+        comparatorOptions.getPackagesInclude().addAll(options.getPackagesInclude());
+        comparatorOptions.getPackagesExclude().addAll(options.getPackagesExclude());
+    }
+
+    private void generateOutput(Options options, File oldArchive, File newArchive, List<JApiClass> jApiClasses) {
         OutputTransformer.sortClassesAndMethods(jApiClasses);
-        if(options.getXmlOutputFile().isPresent()) {
+        if (options.getXmlOutputFile().isPresent()) {
             XmlOutputGenerator xmlGenerator = new XmlOutputGenerator();
             xmlGenerator.generate(oldArchive, newArchive, jApiClasses, options);
         }
@@ -35,28 +59,29 @@ public class JApiCmp {
         System.out.println(output);
     }
 
-    private static Options parseCliOptions(String[] args) {
+    private Options parseCliOptions(String[] args) {
         try {
             CliParser cliParser = new CliParser();
             return cliParser.parse(args);
         } catch (IllegalArgumentException e) {
-            System.err.println(e.getMessage());
-            System.exit(-1);
+            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, e.getMessage());
         } catch (Exception e) {
-            System.err.println("Failed to parse command line options: " + e.getMessage());
-            System.exit(-1);
+            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, "Failed to parse command line options: " + e.getMessage());
         }
-        return new Options();
     }
 
-    private static void verifyFilesExist(File oldArchive, File newArchive) {
+    private void verifyFilesExist(File oldArchive, File newArchive) {
         if (!oldArchive.exists()) {
-            System.err.println(String.format("File '%s' does not exist.", oldArchive.getAbsolutePath()));
-            System.exit(-1);
+            String msg = String.format("File '%s' does not exist.", oldArchive.getAbsolutePath());
+            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
         }
         if (!newArchive.exists()) {
-            System.err.println(String.format("File '%s' does not exist.", newArchive.getAbsolutePath()));
-            System.exit(-1);
+            String msg = String.format("File '%s' does not exist.", newArchive.getAbsolutePath());
+            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
+        }
+        if(oldArchive.equals(newArchive)) {
+            String msg = String.format("Files '%s' and '%s' are the same.", oldArchive.getAbsolutePath(), newArchive.getAbsolutePath());
+            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
         }
     }
 }
diff --git a/japicmp/src/main/java/japicmp/cli/CliParser.java b/japicmp/src/main/java/japicmp/cli/CliParser.java
index db1e287..83ae01e 100644
--- a/japicmp/src/main/java/japicmp/cli/CliParser.java
+++ b/japicmp/src/main/java/japicmp/cli/CliParser.java
@@ -2,7 +2,9 @@ package japicmp.cli;
 
 import com.google.common.base.Optional;
 import japicmp.cmp.AccessModifier;
+import japicmp.cmp.PackageFilter;
 import japicmp.config.Options;
+import japicmp.exception.JApiCmpException;
 import japicmp.util.StringArrayEnumeration;
 
 public class CliParser {
@@ -27,30 +29,60 @@ public class CliParser {
             if ("-m".equals(arg)) {
                 options.setOutputOnlyModifications(true);
             }
-            if ("-h".equals(arg)) {
-                System.out.println("Available parameters:");
-                System.out.println("-h                        Prints this help.");
-                System.out.println("-o <pathToOldVersionJar>  Provides the path to the old version of the jar.");
-                System.out.println("-n <pathToNewVersionJar>  Provides the path to the new version of the jar.");
-                System.out.println("-x <pathToXmlOutputFile>  Provides the path to the xml output file. If not given, stdout is used.");
-                System.out.println("-a <accessModifier>       Sets the access modifier level (public, package, protected, private), which should be used.");
-                System.out.println("-m                        Outputs only modified classes/methods. If not given, all classes and methods are printed.");
-                System.exit(0);
-            }
             if ("-a".equals(arg)) {
                 String accessModifierArg = getOptionWithArgument("-a", sae);
                 try {
                     AccessModifier accessModifier = AccessModifier.valueOf(accessModifierArg.toUpperCase());
-                    options.setAcessModifier(accessModifier);
+                    options.setAccessModifier(accessModifier);
                 } catch (IllegalArgumentException e) {
                     throw new IllegalArgumentException(String.format("Invalid value for option -a: %s. Possible values are: %s.", accessModifierArg, listOfAccessModifiers()));
                 }
             }
+            if ("-i".equals(arg)) {
+                String packagesIncludeArg = getOptionWithArgument("-i", sae);
+                String[] parts = packagesIncludeArg.split(",");
+                for (String part : parts) {
+                    part = part.trim();
+                    try {
+                        options.getPackagesInclude().add(new PackageFilter(part));
+                    } catch (Exception e) {
+                        throw new IllegalArgumentException(String.format("Wrong syntax for include option '%s': %s", part, e.getMessage()));
+                    }
+                }
+            }
+            if ("-e".equals(arg)) {
+                String packagesExcludeArg = getOptionWithArgument("-e", sae);
+                String[] parts = packagesExcludeArg.split(",");
+                for (String part : parts) {
+                    part = part.trim();
+                    try {
+                        options.getPackagesInclude().add(new PackageFilter(part));
+                    } catch (Exception e) {
+                        throw new IllegalArgumentException(String.format("Wrong syntax for exclude option '%s': %s", part, e.getMessage()));
+                    }
+                }
+            }
+            if ("-h".equals(arg)) {
+                printHelp();
+            }
         }
         checkForMandatoryOptions(options);
         return options;
     }
 
+    private void printHelp() {
+        System.out.println("Available parameters:");
+        System.out.println("-h                        Prints this help.");
+        System.out.println("-o <pathToOldVersionJar>  Provides the path to the old version of the jar.");
+        System.out.println("-n <pathToNewVersionJar>  Provides the path to the new version of the jar.");
+        System.out.println("-x <pathToXmlOutputFile>  Provides the path to the xml output file. If not given, stdout is used.");
+        System.out.println("-a <accessModifier>       Sets the access modifier level (public, package, protected, private), which should be used.");
+        System.out.println("-i <packagesToInclude>    Comma separated list of package names to include, * can be used as wildcard.");
+        System.out.println("-e <packagesToExclude>    Comma separated list of package names to exclude, * can be used as wildcard.");
+        System.out.println("-m                        Outputs only modified classes/methods. If not given, all classes and methods are printed.");
+        throw new JApiCmpException(JApiCmpException.Reason.NormalTermination);
+    }
+
     private void checkForMandatoryOptions(Options options) {
         if (options.getOldArchive() == null || options.getOldArchive().length() == 0) {
             throw new IllegalArgumentException("Missing option for old version: -o <pathToOldVersionJar>");
diff --git a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java
index 3dbdda4..af1a0e0 100644
--- a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java
+++ b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java
@@ -4,7 +4,6 @@ import japicmp.model.JApiClass;
 import japicmp.util.ModifierHelper;
 import javassist.ClassPool;
 import javassist.CtClass;
-import javassist.Modifier;
 import org.apache.log4j.Logger;
 
 import java.io.File;
@@ -72,7 +71,7 @@ public class JarArchiveComparator {
                         logger.error(String.format("Failed to load file from jar '%s' as class file: %s.", name, e.getMessage()));
                         throw e;
                     }
-                    if(ModifierHelper.matchesModifierLevel(ctClass.getModifiers(), options.getModifierLevel())) {
+                    if (ModifierHelper.matchesModifierLevel(ctClass.getModifiers(), options.getModifierLevel()) && packageMatches(options, ctClass)) {
                         classes.add(ctClass);
                     }
                     if (logger.isDebugEnabled()) {
@@ -89,4 +88,23 @@ public class JarArchiveComparator {
         }
         return classes;
     }
+
+    private boolean packageMatches(JarArchiveComparatorOptions options, CtClass ctClass) {
+        String packageName = ctClass.getPackageName();
+        for (PackageFilter packageFilter : options.getPackagesInclude()) {
+            if (packageFilter.matches(packageName)) {
+                return true;
+            }
+        }
+        for (PackageFilter packageFilter : options.getPackagesExclude()) {
+            if (packageFilter.matches(packageName)) {
+                return false;
+            }
+        }
+        int noInclude = options.getPackagesInclude().size();
+        if (noInclude > 0) {
+            return false;
+        }
+        return true;
+    }
 }
diff --git a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java
index cd2a328..d30d03e 100644
--- a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java
+++ b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java
@@ -4,15 +4,15 @@ import java.util.LinkedList;
 import java.util.List;
 
 public class JarArchiveComparatorOptions {
-    private List<String> packagesInclude = new LinkedList<String>();
-    private List<String> packagesExclude = new LinkedList<String>();
+    private List<PackageFilter> packagesInclude = new LinkedList<PackageFilter>();
+    private List<PackageFilter> packagesExclude = new LinkedList<PackageFilter>();
     private AccessModifier modifierLevel = AccessModifier.PUBLIC;
 
-    public List<String> getPackagesExclude() {
+    public List<PackageFilter> getPackagesExclude() {
         return packagesExclude;
     }
 
-    public List<String> getPackagesInclude() {
+    public List<PackageFilter> getPackagesInclude() {
         return packagesInclude;
     }
 
diff --git a/japicmp/src/main/java/japicmp/cmp/PackageFilter.java b/japicmp/src/main/java/japicmp/cmp/PackageFilter.java
new file mode 100644
index 0000000..0045c22
--- /dev/null
+++ b/japicmp/src/main/java/japicmp/cmp/PackageFilter.java
@@ -0,0 +1,18 @@
+package japicmp.cmp;
+
+import java.util.regex.Pattern;
+
+public class PackageFilter {
+    private final Pattern pattern;
+
+    public PackageFilter(String packageName) {
+        String regEx = packageName.replace(".", "\\.");
+        regEx = regEx.replace("*", ".*");
+        regEx = regEx + "(\\.[^\\.]+)*";
+        pattern = Pattern.compile(regEx);
+    }
+
+    public boolean matches(String str) {
+        return pattern.matcher(str).matches();
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/config/Options.java b/japicmp/src/main/java/japicmp/config/Options.java
index 6337fac..b4e46b8 100644
--- a/japicmp/src/main/java/japicmp/config/Options.java
+++ b/japicmp/src/main/java/japicmp/config/Options.java
@@ -2,13 +2,19 @@ package japicmp.config;
 
 import com.google.common.base.Optional;
 import japicmp.cmp.AccessModifier;
+import japicmp.cmp.PackageFilter;
+
+import java.util.LinkedList;
+import java.util.List;
 
 public class Options {
     private String oldArchive;
     private String newArchive;
     private boolean outputOnlyModifications = false;
     private Optional<String> xmlOutputFile = Optional.<String>absent();
-    private AccessModifier acessModifier = AccessModifier.PUBLIC;
+    private AccessModifier accessModifier = AccessModifier.PUBLIC;
+    private List<PackageFilter> packagesInclude = new LinkedList<PackageFilter>();
+    private List<PackageFilter> packagesExclude = new LinkedList<PackageFilter>();
 
     public String getNewArchive() {
         return newArchive;
@@ -42,11 +48,19 @@ public class Options {
         this.xmlOutputFile = xmlOutputFile;
     }
 
-    public void setAcessModifier(AccessModifier acessModifier) {
-        this.acessModifier = acessModifier;
+    public void setAccessModifier(AccessModifier accessModifier) {
+        this.accessModifier = accessModifier;
+    }
+
+    public AccessModifier getAccessModifier() {
+        return accessModifier;
+    }
+
+    public List<PackageFilter> getPackagesInclude() {
+        return packagesInclude;
     }
 
-    public AccessModifier getAcessModifier() {
-        return acessModifier;
+    public List<PackageFilter> getPackagesExclude() {
+        return packagesExclude;
     }
 }
diff --git a/japicmp/src/main/java/japicmp/exception/JApiCmpException.java b/japicmp/src/main/java/japicmp/exception/JApiCmpException.java
new file mode 100644
index 0000000..4bc8ae8
--- /dev/null
+++ b/japicmp/src/main/java/japicmp/exception/JApiCmpException.java
@@ -0,0 +1,22 @@
+package japicmp.exception;
+
+public class JApiCmpException extends RuntimeException {
+    private final Reason reason;
+
+    public JApiCmpException(Reason reason) {
+        this.reason = reason;
+    }
+
+    public enum Reason {
+        IllegalArgument, NormalTermination
+    }
+
+    public JApiCmpException(Reason reason, String msg) {
+        super(msg);
+        this.reason = reason;
+    }
+
+    public Reason getReason() {
+        return reason;
+    }
+}
diff --git a/japicmp/src/test/java/japicmp/cmp/PackageFilterTest.java b/japicmp/src/test/java/japicmp/cmp/PackageFilterTest.java
new file mode 100644
index 0000000..8bffab9
--- /dev/null
+++ b/japicmp/src/test/java/japicmp/cmp/PackageFilterTest.java
@@ -0,0 +1,44 @@
+package japicmp.cmp;
+
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class PackageFilterTest {
+
+    @Test
+    public void testWithoutWildcard() {
+        PackageFilter pf = new PackageFilter("de.test.package");
+        assertThat(pf.matches("de.test.package"), is(true));
+        assertThat(pf.matches("de.test.package.packageOne"), is(true));
+        assertThat(pf.matches("de.test.package."), is(false));
+        assertThat(pf.matches("de.test.packag"), is(false));
+        assertThat(pf.matches("de.test"), is(false));
+    }
+
+    @Test
+    public void testWithWildcardAfterDot() {
+        PackageFilter pf = new PackageFilter("de.test.package.*");
+        assertThat(pf.matches("de.test.package"), is(false));
+        assertThat(pf.matches("de.test.package.packageOne"), is(true));
+        assertThat(pf.matches("de.test.package.packageOne.p2"), is(true));
+    }
+
+    @Test
+    public void testWithWildcardWithoutDot() {
+        PackageFilter pf = new PackageFilter("de.test.package*");
+        assertThat(pf.matches("de.test.package"), is(true));
+        assertThat(pf.matches("de.test.package.packageOne"), is(true));
+        assertThat(pf.matches("de.test.package.packageOne.p2"), is(true));
+    }
+
+    @Test
+    public void testWithWildcardAndFollowingPackagename() {
+        PackageFilter pf = new PackageFilter("de.test.package.*.test");
+        assertThat(pf.matches("de.test.package"), is(false));
+        assertThat(pf.matches("de.test.package.p.test"), is(true));
+        assertThat(pf.matches("de.test.package.packageOne.test"), is(true));
+        assertThat(pf.matches("de.test.package.packageOne.test2"), is(false));
+    }
+}
diff --git a/pom.xml b/pom.xml
index 6b07683..27bdf0e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<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">
+<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>japicmp</groupId>
@@ -9,13 +10,13 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<github.account>siom79</github.account>
+        <github.account>siom79</github.account>
         <cloudbees.account>siom79</cloudbees.account>
     </properties>
 
     <modules>
         <module>japicmp</module>
-		<module>japicmp-testbase</module>
+        <module>japicmp-testbase</module>
     </modules>
 
     <dependencies>
@@ -29,7 +30,7 @@
 
     <build>
         <plugins>
-			<plugin>
+            <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>3.1</version>
@@ -85,22 +86,45 @@
                 </executions>
             </plugin>
         </plugins>
-		<extensions>
+        <extensions>
             <extension>
                 <groupId>org.apache.maven.wagon</groupId>
                 <artifactId>wagon-webdav-jackrabbit</artifactId>
                 <version>1.0-beta-7</version>
             </extension>
         </extensions>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>cobertura-maven-plugin</artifactId>
+                    <version>2.5.2</version>
+                    <configuration>
+                        <formats>
+                            <format>html</format>
+                        </formats>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <phase>verify</phase>
+                            <goals>
+                                <goal>clean</goal>
+                                <goal>cobertura</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
+            </plugins>
+        </pluginManagement>
     </build>
-	
+
     <scm>
         <connection>scm:git:git://github.com/${github.account}/${project.groupId}.git</connection>
         <developerConnection>scm:git:git@github.com:${github.account}/${project.groupId}.git</developerConnection>
         <url>http://github.com/${github.account}/${project.groupId}/tree/master/</url>
         <tag>HEAD</tag>
     </scm>
-	
+
     <distributionManagement>
         <repository>
             <id>cloudbees-public-release</id>
@@ -111,7 +135,7 @@
             <url>dav:https://repository-${cloudbees.account}.forge.cloudbees.com/snapshot</url>
         </snapshotRepository>
     </distributionManagement>
-	
+
     <repositories>
         <repository>
             <id>cloudbees-public-snapshot</id>


[commons-vfs] 02/09: Updated README.md

Posted by gg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to annotated tag japicmp-base-0.0.2
in repository https://gitbox.apache.org/repos/asf/commons-vfs.git

commit 6c1a4019eabc76e161906bd4a34c49ee43b6fa57
Author: siom79 <ma...@googlemail.com>
AuthorDate: Thu Oct 3 14:53:53 2013 +0200

    Updated README.md
---
 README.md | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/README.md b/README.md
index 2b21e44..31554de 100644
--- a/README.md
+++ b/README.md
@@ -65,6 +65,10 @@ In the following you see the beginning of the xml output file after having compu
 
 ##Downloads##
 
+The following release are available:
+
+* [Version 0.0.1](http://repository-siom79.forge.cloudbees.com/release/japicmp/japicmp/0.0.1/japicmp-0.0.1.jar)
+
 The latest snapshot version can be downloaded here: [japicmp-SNAPSHOT](http://repository-siom79.forge.cloudbees.com/snapshot/japicmp/japicmp/)
 
 ##Development##


[commons-vfs] 07/09: updated README.md

Posted by gg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to annotated tag japicmp-base-0.0.2
in repository https://gitbox.apache.org/repos/asf/commons-vfs.git

commit 329ab8501a0b31cfb1f767ee909f76bf667a569b
Author: siom79 <ma...@googlemail.com>
AuthorDate: Sun Oct 6 11:34:26 2013 +0200

    updated README.md
---
 README.md | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index 445b87b..b1aae7e 100644
--- a/README.md
+++ b/README.md
@@ -73,7 +73,7 @@ In the following you see the beginning of the xml output file after having compu
 
 ##Downloads##
 
-The following release are available:
+The following releases are available:
 
 * [Version 0.0.1](http://repository-siom79.forge.cloudbees.com/release/japicmp/japicmp/0.0.1/japicmp-0.0.1.jar)
 
@@ -81,5 +81,6 @@ The latest snapshot version can be downloaded here: [japicmp-SNAPSHOT](http://re
 
 ##Development##
 
-* [Jenkins build server](https://siom79.ci.cloudbees.com/job/japicmp) [![Build Status](https://siom79.ci.cloudbees.com/job/japicmp/badge/icon)](https://siom79.ci.cloudbees.com/job/japicmp)
-* [Maven snapshot repository](https://repository-siom79.forge.cloudbees.com/snapshot)
\ No newline at end of file
+* [Jenkins build server](https://siom79.ci.cloudbees.com/job/japicmp)
+* [Maven snapshot repository](https://repository-siom79.forge.cloudbees.com/snapshot)
+* [Maven release repository](https://repository-siom79.forge.cloudbees.com/release)
\ No newline at end of file


[commons-vfs] 03/09: added -a option that lets the user specify the access modifier level used to compare classes and class members

Posted by gg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to annotated tag japicmp-base-0.0.2
in repository https://gitbox.apache.org/repos/asf/commons-vfs.git

commit 53a32f8f836bc6e2cb573b4404d9ec58f1ee67a9
Author: siom79 <ma...@googlemail.com>
AuthorDate: Thu Oct 3 22:15:56 2013 +0200

    added -a option that lets the user specify the access modifier level used to compare classes and class members
---
 README.md                                          | 47 ++++++++++++----------
 .../src/main/java/japicmp/test/Modifier.java       | 12 ++++++
 .../src/main/java/japicmp/test/Modifier.java       | 12 ++++++
 .../src/test/java/japicmp/test/BasicTest.java      | 29 ++-----------
 .../src/test/java/japicmp/test/ModifierTest.java   | 44 ++++++++++++++++++++
 .../src/test/java/japicmp/test/util/Helper.java    | 32 +++++++++++++++
 japicmp/src/main/java/japicmp/cli/CliParser.java   | 26 +++++++++++-
 .../src/main/java/japicmp/cmp/AccessModifier.java  | 15 +++++++
 .../src/main/java/japicmp/cmp/ClassComparator.java | 18 ++++++---
 .../main/java/japicmp/cmp/ClassesComparator.java   |  8 ++--
 .../java/japicmp/cmp/JarArchiveComparator.java     | 21 ++++++----
 .../japicmp/cmp/JarArchiveComparatorOptions.java   |  9 +++++
 japicmp/src/main/java/japicmp/config/Options.java  | 10 +++++
 japicmp/src/main/java/japicmp/model/JApiClass.java | 23 ++++++++++-
 .../src/main/java/japicmp/model/JApiMethod.java    | 23 ++++++++++-
 .../output/stdout/StdoutOutputGenerator.java       |  2 +-
 .../src/main/java/japicmp/util/ModifierHelper.java | 29 +++++++++++++
 .../test/java/japicmp/util/ModifierHelperTest.java | 41 +++++++++++++++++++
 18 files changed, 334 insertions(+), 67 deletions(-)

diff --git a/README.md b/README.md
index 31554de..27f33b2 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@ japicmp
 
 japicmp is a tool to compare two versions of a jar archive:
 
-    java -jar japicmp-0.0.1-SNAPSHOT.jar -n new-version.jar -o old-version.jar
+    java -jar japicmp-0.0.1.jar -n new-version.jar -o old-version.jar
 
 It can also be used as a library to integrate its functionality in some other kind of software:
 
@@ -24,9 +24,11 @@ library to inspect the class files. This way you only have to provide the two ja
 
 ##Features##
 
-* Comparison of two jar archives without the need to add all of their dependencies to the classpath
+* Comparison of two jar archives without the need to add all of their dependencies to the classpath.
 * Differences are printed on the command line in a simple diff format.
 * Differences can optionally be printed to an xml file. This can be transformed to an HTML file using XSLT.
+* Per default only public classes and class members are compared. If necessary, the access modifier of the classes and class members to be
+  compared can be set to package, protected or private.
 
 ##Usage##
 
@@ -36,31 +38,34 @@ The tool has a set of CLI parameters that are described in the following:
     -o <pathToOldVersionJar>  Provides the path to the old version of the jar.
     -n <pathToNewVersionJar>  Provides the path to the new version of the jar.
     -x <pathToXmlOutputFile>  Provides the path to the xml output file. If not given, stdout is used.
+    -a <accessModifier>       Sets the access modifier level (public, package, protected, private), which should be used.
     -m                        Outputs only modified classes/methods. If not given, all classes and methods are printed.
 	
 ###Example###
 
 In the following you see the beginning of the xml output file after having computed the differences between the versions 4.0.1 and 4.2.3 of httpclient:
 
-	<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-	<japicmp newJar="D:\Programmierung\japicmp\github\japicmp\japicmp\httpclient-4.2.3.jar" oldJar="D:\Programmierung\japicmp\github\japicmp\japicmp\httpclient-4.0.1.jar">
-		<class changeStatus="REMOVED" fullyQualifiedName="org.apache.http.annotation.GuardedBy" type="ANNOTATION">
-			<method changeStatus="REMOVED" name="value" returnType="java.lang.String"/>
-		</class>
-		<class changeStatus="REMOVED" fullyQualifiedName="org.apache.http.annotation.Immutable" type="ANNOTATION"/>
-		<class changeStatus="REMOVED" fullyQualifiedName="org.apache.http.annotation.NotThreadSafe" type="ANNOTATION"/>
-		<class changeStatus="REMOVED" fullyQualifiedName="org.apache.http.annotation.ThreadSafe" type="ANNOTATION"/>
-		<class changeStatus="NEW" fullyQualifiedName="org.apache.http.auth.AuthOption" type="CLASS">
-			<method changeStatus="NEW" name="getAuthScheme" returnType="org.apache.http.auth.AuthScheme"/>
-			<method changeStatus="NEW" name="getCredentials" returnType="org.apache.http.auth.Credentials"/>
-			<method changeStatus="NEW" name="toString" returnType="java.lang.String"/>
-		</class>
-		<class changeStatus="NEW" fullyQualifiedName="org.apache.http.auth.AuthProtocolState" type="ENUM">
-			<method changeStatus="NEW" name="valueOf" returnType="org.apache.http.auth.AuthProtocolState">
-				<parameter type="java.lang.String"/>
-			</method>
-			<method changeStatus="NEW" name="values" returnType="org.apache.http.auth.AuthProtocolState[]"/>
-		</class>
+    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+    <japicmp newJar="D:\Programmierung\japicmp\github\japicmp\japicmp\httpclient-4.2.3.jar" oldJar="D:\Programmierung\japicmp\github\japicmp\japicmp\httpclient-4.0.1.jar">
+        <class accessModifierNew="n.a." accessModifierOld="PUBLIC" changeStatus="REMOVED" fullyQualifiedName="org.apache.http.annotation.GuardedBy" type="ANNOTATION">
+            <method accessModifierNew="n.a." accessModifierOld="PUBLIC" changeStatus="REMOVED" name="value" returnType="java.lang.String"/>
+        </class>
+        <class accessModifierNew="n.a." accessModifierOld="PUBLIC" changeStatus="REMOVED" fullyQualifiedName="org.apache.http.annotation.Immutable" type="ANNOTATION"/>
+        <class accessModifierNew="n.a." accessModifierOld="PUBLIC" changeStatus="REMOVED" fullyQualifiedName="org.apache.http.annotation.NotThreadSafe" type="ANNOTATION"/>
+        <class accessModifierNew="n.a." accessModifierOld="PUBLIC" changeStatus="REMOVED" fullyQualifiedName="org.apache.http.annotation.ThreadSafe" type="ANNOTATION"/>
+        <class accessModifierNew="PUBLIC" accessModifierOld="PUBLIC" changeStatus="UNCHANGED" fullyQualifiedName="org.apache.http.auth.AUTH" type="CLASS"/>
+        <class accessModifierNew="PUBLIC" accessModifierOld="PUBLIC" changeStatus="UNCHANGED" fullyQualifiedName="org.apache.http.auth.AuthenticationException" type="CLASS"/>
+        <class accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" fullyQualifiedName="org.apache.http.auth.AuthOption" type="CLASS">
+            <method accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" name="getAuthScheme" returnType="org.apache.http.auth.AuthScheme"/>
+            <method accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" name="getCredentials" returnType="org.apache.http.auth.Credentials"/>
+            <method accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" name="toString" returnType="java.lang.String"/>
+        </class>
+        <class accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" fullyQualifiedName="org.apache.http.auth.AuthProtocolState" type="ENUM">
+            <method accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" name="valueOf" returnType="org.apache.http.auth.AuthProtocolState">
+                <parameter type="java.lang.String"/>
+            </method>
+            <method accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" name="values" returnType="org.apache.http.auth.AuthProtocolState[]"/>
+        </class>
 		...
 
 ##Downloads##
diff --git a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Modifier.java b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Modifier.java
new file mode 100644
index 0000000..b53a7bf
--- /dev/null
+++ b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Modifier.java
@@ -0,0 +1,12 @@
+package japicmp.test;
+
+public class Modifier {
+
+    public void publicToPrivateMethod() {
+
+    }
+
+    public static class ModifierPublicToProtected {
+
+    }
+}
diff --git a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Modifier.java b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Modifier.java
new file mode 100644
index 0000000..65bf223
--- /dev/null
+++ b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Modifier.java
@@ -0,0 +1,12 @@
+package japicmp.test;
+
+public class Modifier {
+
+    private void publicToPrivateMethod() {
+
+    }
+
+    private static class ModifierPublicToProtected {
+
+    }
+}
diff --git a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java
index 7abab9b..c02ea3a 100644
--- a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java
+++ b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java
@@ -4,12 +4,13 @@ import japicmp.cmp.JarArchiveComparator;
 import japicmp.cmp.JarArchiveComparatorOptions;
 import japicmp.model.JApiChangeStatus;
 import japicmp.model.JApiClass;
-import japicmp.model.JApiMethod;
 import org.junit.Test;
 
-import java.io.File;
 import java.util.List;
 
+import static japicmp.test.util.Helper.getArchive;
+import static japicmp.test.util.Helper.getJApiClass;
+import static japicmp.test.util.Helper.getJApiMethod;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.junit.Assert.assertThat;
@@ -20,7 +21,7 @@ public class BasicTest {
     public void test() {
         JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(new JarArchiveComparatorOptions());
         List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
-        assertThat(jApiClasses.size(), is(3));
+        assertThat(jApiClasses.size(), is(5));
         JApiClass jApiClassRemoved = getJApiClass(jApiClasses, Removed.class.getName());
         JApiClass jApiClassAdded = getJApiClass(jApiClasses, Added.class.getName());
         JApiClass jApiClassUnchanged = getJApiClass(jApiClasses, Unchanged.class.getName());
@@ -32,26 +33,4 @@ public class BasicTest {
         assertThat(jApiClassUnchanged.getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
         assertThat(getJApiMethod(jApiClassUnchanged.getMethods(), "unchangedMethod"), is(notNullValue()));
     }
-
-    private File getArchive(String filename) {
-        return new File("target" + File.separator + filename);
-    }
-
-    private JApiClass getJApiClass(List<JApiClass> jApiClasses, String fqn) {
-        for (JApiClass jApiClass : jApiClasses) {
-            if (jApiClass.getFullyQualifiedName().equals(fqn)) {
-                return jApiClass;
-            }
-        }
-        throw new IllegalArgumentException("No class found with name " + fqn + ".");
-    }
-
-    private JApiMethod getJApiMethod(List<JApiMethod> jApiMethods, String name) {
-        for(JApiMethod jApiMethod : jApiMethods) {
-            if(jApiMethod.getName().equals(name)) {
-                return jApiMethod;
-            }
-        }
-        throw new IllegalArgumentException("No method found with name " + name + ".");
-    }
 }
diff --git a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/ModifierTest.java b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/ModifierTest.java
new file mode 100644
index 0000000..f939228
--- /dev/null
+++ b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/ModifierTest.java
@@ -0,0 +1,44 @@
+package japicmp.test;
+
+import japicmp.cmp.AccessModifier;
+import japicmp.cmp.JarArchiveComparator;
+import japicmp.cmp.JarArchiveComparatorOptions;
+import japicmp.model.JApiChangeStatus;
+import japicmp.model.JApiClass;
+import japicmp.test.util.Helper;
+import org.junit.Test;
+
+import java.util.List;
+
+import static japicmp.test.util.Helper.getArchive;
+import static japicmp.test.util.Helper.getJApiClass;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+public class ModifierTest {
+
+    @Test
+    public void testOptionPublicModifier() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.setModifierLevel(AccessModifier.PUBLIC);
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        JApiClass modifierInnerClass = getJApiClass(jApiClasses, Modifier.ModifierPublicToProtected.class.getName());
+        JApiClass modifierClass = getJApiClass(jApiClasses, Modifier.class.getName());
+        assertThat(modifierInnerClass.getChangeStatus(), is(JApiChangeStatus.REMOVED));
+        assertThat(Helper.getJApiMethod(modifierClass.getMethods(), "publicToPrivateMethod").getChangeStatus(), is(JApiChangeStatus.REMOVED));
+    }
+
+    @Test
+    public void testOptionPrivateModifier() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.setModifierLevel(AccessModifier.PRIVATE);
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        JApiClass modifierInnerClass = getJApiClass(jApiClasses, Modifier.ModifierPublicToProtected.class.getName());
+        JApiClass modifierClass = getJApiClass(jApiClasses, Modifier.class.getName());
+        assertThat(modifierInnerClass.getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
+        assertThat(Helper.getJApiMethod(modifierClass.getMethods(), "publicToPrivateMethod").getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
+    }
+}
diff --git a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/util/Helper.java b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/util/Helper.java
new file mode 100644
index 0000000..c98da86
--- /dev/null
+++ b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/util/Helper.java
@@ -0,0 +1,32 @@
+package japicmp.test.util;
+
+import japicmp.model.JApiClass;
+import japicmp.model.JApiMethod;
+
+import java.io.File;
+import java.util.List;
+
+public class Helper {
+
+    public static File getArchive(String filename) {
+        return new File("target" + File.separator + filename);
+    }
+
+    public static JApiClass getJApiClass(List<JApiClass> jApiClasses, String fqn) {
+        for (JApiClass jApiClass : jApiClasses) {
+            if (jApiClass.getFullyQualifiedName().equals(fqn)) {
+                return jApiClass;
+            }
+        }
+        throw new IllegalArgumentException("No class found with name " + fqn + ".");
+    }
+
+    public static JApiMethod getJApiMethod(List<JApiMethod> jApiMethods, String name) {
+        for(JApiMethod jApiMethod : jApiMethods) {
+            if(jApiMethod.getName().equals(name)) {
+                return jApiMethod;
+            }
+        }
+        throw new IllegalArgumentException("No method found with name " + name + ".");
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/cli/CliParser.java b/japicmp/src/main/java/japicmp/cli/CliParser.java
index 1e1f788..db1e287 100644
--- a/japicmp/src/main/java/japicmp/cli/CliParser.java
+++ b/japicmp/src/main/java/japicmp/cli/CliParser.java
@@ -1,6 +1,7 @@
 package japicmp.cli;
 
 import com.google.common.base.Optional;
+import japicmp.cmp.AccessModifier;
 import japicmp.config.Options;
 import japicmp.util.StringArrayEnumeration;
 
@@ -32,9 +33,19 @@ public class CliParser {
                 System.out.println("-o <pathToOldVersionJar>  Provides the path to the old version of the jar.");
                 System.out.println("-n <pathToNewVersionJar>  Provides the path to the new version of the jar.");
                 System.out.println("-x <pathToXmlOutputFile>  Provides the path to the xml output file. If not given, stdout is used.");
+                System.out.println("-a <accessModifier>       Sets the access modifier level (public, package, protected, private), which should be used.");
                 System.out.println("-m                        Outputs only modified classes/methods. If not given, all classes and methods are printed.");
                 System.exit(0);
             }
+            if ("-a".equals(arg)) {
+                String accessModifierArg = getOptionWithArgument("-a", sae);
+                try {
+                    AccessModifier accessModifier = AccessModifier.valueOf(accessModifierArg.toUpperCase());
+                    options.setAcessModifier(accessModifier);
+                } catch (IllegalArgumentException e) {
+                    throw new IllegalArgumentException(String.format("Invalid value for option -a: %s. Possible values are: %s.", accessModifierArg, listOfAccessModifiers()));
+                }
+            }
         }
         checkForMandatoryOptions(options);
         return options;
@@ -52,7 +63,7 @@ public class CliParser {
     private String getOptionWithArgument(String option, StringArrayEnumeration sae) {
         if (sae.hasMoreElements()) {
             String value = sae.nextElement();
-            if(value.startsWith("-")) {
+            if (value.startsWith("-")) {
                 throw new IllegalArgumentException(String.format("Missing argument for option %s.", option));
             }
             return value;
@@ -60,4 +71,17 @@ public class CliParser {
             throw new IllegalArgumentException(String.format("Missing argument for option %s.", option));
         }
     }
+
+    private String listOfAccessModifiers() {
+        StringBuilder sb = new StringBuilder();
+        int i = 0;
+        for (AccessModifier am : AccessModifier.values()) {
+            if (i > 0) {
+                sb.append(",");
+            }
+            sb.append(am.toString());
+            i++;
+        }
+        return sb.toString();
+    }
 }
diff --git a/japicmp/src/main/java/japicmp/cmp/AccessModifier.java b/japicmp/src/main/java/japicmp/cmp/AccessModifier.java
new file mode 100644
index 0000000..8f9ffec
--- /dev/null
+++ b/japicmp/src/main/java/japicmp/cmp/AccessModifier.java
@@ -0,0 +1,15 @@
+package japicmp.cmp;
+
+public enum AccessModifier {
+    PUBLIC(3), PACKAGE(2), PROTECTED(1), PRIVATE(0);
+
+    private int level;
+
+    AccessModifier(int level) {
+        this.level = level;
+    }
+
+    public int getLevel() {
+        return level;
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/cmp/ClassComparator.java b/japicmp/src/main/java/japicmp/cmp/ClassComparator.java
index 92838e7..0bcb783 100644
--- a/japicmp/src/main/java/japicmp/cmp/ClassComparator.java
+++ b/japicmp/src/main/java/japicmp/cmp/ClassComparator.java
@@ -5,6 +5,7 @@ import japicmp.model.JApiChangeStatus;
 import japicmp.model.JApiClass;
 import japicmp.model.JApiMethod;
 import japicmp.model.JApiParameter;
+import japicmp.util.ModifierHelper;
 import japicmp.util.SignatureParser;
 import javassist.CtClass;
 import javassist.CtMethod;
@@ -13,6 +14,11 @@ import java.util.HashMap;
 import java.util.Map;
 
 public class ClassComparator {
+    private final JarArchiveComparatorOptions options;
+
+    public ClassComparator(JarArchiveComparatorOptions options) {
+        this.options = options;
+    }
 
     public void compare(JApiClass jApiClass) {
         Map<String, CtMethod> oldMethodsMap = createMethodMap(jApiClass.getOldClass());
@@ -27,14 +33,14 @@ public class ClassComparator {
             signatureParser.parse(ctMethod.getSignature());
             CtMethod foundMethod = newMethodsMap.get(longName);
             if (foundMethod == null) {
-                JApiMethod jApiMethod = new JApiMethod(ctMethod.getName(), JApiChangeStatus.REMOVED, Optional.of(ctMethod), Optional.<CtMethod>absent(), signatureParser.getReturnType());
+                JApiMethod jApiMethod = new JApiMethod(ctMethod.getName(), JApiChangeStatus.REMOVED, Optional.of(ctMethod), Optional.<CtMethod>absent(), signatureParser.getReturnType(), Optional.of(ModifierHelper.translateToModifierLevel(ctMethod.getModifiers())), Optional.<AccessModifier>absent());
                 addParametersToMethod(signatureParser, jApiMethod);
                 jApiClass.addMethod(jApiMethod);
                 if(jApiClass.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
                     jApiClass.setChangeStatus(JApiChangeStatus.MODIFIED);
                 }
             } else {
-                JApiMethod jApiMethod = new JApiMethod(ctMethod.getName(), JApiChangeStatus.UNCHANGED, Optional.of(ctMethod), Optional.of(foundMethod), signatureParser.getReturnType());
+                JApiMethod jApiMethod = new JApiMethod(ctMethod.getName(), JApiChangeStatus.UNCHANGED, Optional.of(ctMethod), Optional.of(foundMethod), signatureParser.getReturnType(), Optional.of(ModifierHelper.translateToModifierLevel(ctMethod.getModifiers())), Optional.of(ModifierHelper.translateToModifierLevel(foundMethod.getModifiers())));
                 addParametersToMethod(signatureParser, jApiMethod);
                 jApiClass.addMethod(jApiMethod);
             }
@@ -44,7 +50,7 @@ public class ClassComparator {
             signatureParser.parse(ctMethod.getSignature());
             CtMethod foundMethod = oldMethodsMap.get(longName);
             if (foundMethod == null) {
-                JApiMethod jApiMethod = new JApiMethod(ctMethod.getName(), JApiChangeStatus.NEW, Optional.<CtMethod>absent(), Optional.of(ctMethod), signatureParser.getReturnType());
+                JApiMethod jApiMethod = new JApiMethod(ctMethod.getName(), JApiChangeStatus.NEW, Optional.<CtMethod>absent(), Optional.of(ctMethod), signatureParser.getReturnType(), Optional.<AccessModifier>absent(), Optional.of(ModifierHelper.translateToModifierLevel(ctMethod.getModifiers())));
                 addParametersToMethod(signatureParser, jApiMethod);
                 jApiClass.addMethod(jApiMethod);
                 if(jApiClass.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
@@ -63,8 +69,10 @@ public class ClassComparator {
     private Map<String, CtMethod> createMethodMap(Optional<CtClass> ctClass) {
         Map<String, CtMethod> methods = new HashMap<String, CtMethod>();
         if (ctClass.isPresent()) {
-            for (CtMethod ctMethod : ctClass.get().getMethods()) {
-                methods.put(ctMethod.getLongName(), ctMethod);
+            for (CtMethod ctMethod : ctClass.get().getDeclaredMethods()) {
+                if(ModifierHelper.matchesModifierLevel(ctMethod.getModifiers(), options.getModifierLevel())) {
+                    methods.put(ctMethod.getLongName(), ctMethod);
+                }
             }
         }
         return methods;
diff --git a/japicmp/src/main/java/japicmp/cmp/ClassesComparator.java b/japicmp/src/main/java/japicmp/cmp/ClassesComparator.java
index ee02733..b8e2b48 100644
--- a/japicmp/src/main/java/japicmp/cmp/ClassesComparator.java
+++ b/japicmp/src/main/java/japicmp/cmp/ClassesComparator.java
@@ -3,8 +3,8 @@ package japicmp.cmp;
 import com.google.common.base.Optional;
 import japicmp.model.JApiChangeStatus;
 import japicmp.model.JApiClass;
+import japicmp.util.ModifierHelper;
 import javassist.CtClass;
-import javassist.Modifier;
 
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -25,15 +25,15 @@ public class ClassesComparator {
         for(CtClass ctClass : oldClassesMap.values()) {
             CtClass foundClass = newClassesMap.get(ctClass.getName());
             if(foundClass == null) {
-                classes.add(new JApiClass(ctClass.getName(), Optional.<CtClass>of(ctClass), Optional.<CtClass>absent(), JApiChangeStatus.REMOVED, getType(ctClass)));
+                classes.add(new JApiClass(ctClass.getName(), Optional.<CtClass>of(ctClass), Optional.<CtClass>absent(), JApiChangeStatus.REMOVED, getType(ctClass), Optional.of(ModifierHelper.translateToModifierLevel(ctClass.getModifiers())), Optional.<AccessModifier>absent()));
             } else {
-                classes.add(new JApiClass(ctClass.getName(), Optional.<CtClass>of(ctClass), Optional.<CtClass>of(foundClass), JApiChangeStatus.UNCHANGED, getType(ctClass)));
+                classes.add(new JApiClass(ctClass.getName(), Optional.<CtClass>of(ctClass), Optional.<CtClass>of(foundClass), JApiChangeStatus.UNCHANGED, getType(ctClass), Optional.of(ModifierHelper.translateToModifierLevel(ctClass.getModifiers())), Optional.of(ModifierHelper.translateToModifierLevel(foundClass.getModifiers()))));
             }
         }
         for(CtClass ctClass : newClassesMap.values()) {
             CtClass foundClass = oldClassesMap.get(ctClass.getName());
             if(foundClass == null) {
-                classes.add(new JApiClass(ctClass.getName(), Optional.<CtClass>absent(), Optional.<CtClass>of(ctClass), JApiChangeStatus.NEW, getType(ctClass)));
+                classes.add(new JApiClass(ctClass.getName(), Optional.<CtClass>absent(), Optional.<CtClass>of(ctClass), JApiChangeStatus.NEW, getType(ctClass), Optional.<AccessModifier>absent(), Optional.of(ModifierHelper.translateToModifierLevel(ctClass.getModifiers()))));
             }
         }
     }
diff --git a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java
index 06097d1..3dbdda4 100644
--- a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java
+++ b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java
@@ -1,8 +1,10 @@
 package japicmp.cmp;
 
 import japicmp.model.JApiClass;
+import japicmp.util.ModifierHelper;
 import javassist.ClassPool;
 import javassist.CtClass;
+import javassist.Modifier;
 import org.apache.log4j.Logger;
 
 import java.io.File;
@@ -14,15 +16,16 @@ import java.util.jar.JarFile;
 
 public class JarArchiveComparator {
     private static final Logger logger = Logger.getLogger(JarArchiveComparator.class);
+    private JarArchiveComparatorOptions options;
 
     public JarArchiveComparator(JarArchiveComparatorOptions options) {
-
+        this.options = options;
     }
 
     public List<JApiClass> compare(File oldArchive, File newArchive) {
         ClassPool classPool = new ClassPool();
         try {
-            ClassesComparator classesComparator = compareClassLists(oldArchive, newArchive, classPool);
+            ClassesComparator classesComparator = compareClassLists(oldArchive, newArchive, classPool, options);
             List<JApiClass> classList = classesComparator.getClasses();
             compareClasses(classList);
             return classList;
@@ -34,14 +37,14 @@ public class JarArchiveComparator {
 
     private void compareClasses(List<JApiClass> classList) {
         for (JApiClass jApiClass : classList) {
-            ClassComparator classComparator = new ClassComparator();
+            ClassComparator classComparator = new ClassComparator(options);
             classComparator.compare(jApiClass);
         }
     }
 
-    private ClassesComparator compareClassLists(File oldArchive, File newArchive, ClassPool classPool) throws Exception {
-        List<CtClass> oldClasses = createListOfCtClasses(oldArchive, classPool);
-        List<CtClass> newClasses = createListOfCtClasses(newArchive, classPool);
+    private ClassesComparator compareClassLists(File oldArchive, File newArchive, ClassPool classPool, JarArchiveComparatorOptions options) throws Exception {
+        List<CtClass> oldClasses = createListOfCtClasses(oldArchive, classPool, options);
+        List<CtClass> newClasses = createListOfCtClasses(newArchive, classPool, options);
         ClassesComparator classesComparator = new ClassesComparator();
         classesComparator.compare(oldClasses, newClasses);
         if (logger.isDebugEnabled()) {
@@ -52,7 +55,7 @@ public class JarArchiveComparator {
         return classesComparator;
     }
 
-    private List<CtClass> createListOfCtClasses(File archive, ClassPool classPool) throws Exception {
+    private List<CtClass> createListOfCtClasses(File archive, ClassPool classPool, JarArchiveComparatorOptions options) throws Exception {
         List<CtClass> classes = new LinkedList<CtClass>();
         JarFile oldJar = null;
         try {
@@ -69,7 +72,9 @@ public class JarArchiveComparator {
                         logger.error(String.format("Failed to load file from jar '%s' as class file: %s.", name, e.getMessage()));
                         throw e;
                     }
-                    classes.add(ctClass);
+                    if(ModifierHelper.matchesModifierLevel(ctClass.getModifiers(), options.getModifierLevel())) {
+                        classes.add(ctClass);
+                    }
                     if (logger.isDebugEnabled()) {
                         logger.debug(String.format("Adding class '%s' with jar name '%s' to list.", ctClass.getName(), name));
                     }
diff --git a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java
index c474ef6..cd2a328 100644
--- a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java
+++ b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java
@@ -6,6 +6,7 @@ import java.util.List;
 public class JarArchiveComparatorOptions {
     private List<String> packagesInclude = new LinkedList<String>();
     private List<String> packagesExclude = new LinkedList<String>();
+    private AccessModifier modifierLevel = AccessModifier.PUBLIC;
 
     public List<String> getPackagesExclude() {
         return packagesExclude;
@@ -14,4 +15,12 @@ public class JarArchiveComparatorOptions {
     public List<String> getPackagesInclude() {
         return packagesInclude;
     }
+
+    public AccessModifier getModifierLevel() {
+        return modifierLevel;
+    }
+
+    public void setModifierLevel(AccessModifier modifierLevel) {
+        this.modifierLevel = modifierLevel;
+    }
 }
diff --git a/japicmp/src/main/java/japicmp/config/Options.java b/japicmp/src/main/java/japicmp/config/Options.java
index 4576f72..6337fac 100644
--- a/japicmp/src/main/java/japicmp/config/Options.java
+++ b/japicmp/src/main/java/japicmp/config/Options.java
@@ -1,12 +1,14 @@
 package japicmp.config;
 
 import com.google.common.base.Optional;
+import japicmp.cmp.AccessModifier;
 
 public class Options {
     private String oldArchive;
     private String newArchive;
     private boolean outputOnlyModifications = false;
     private Optional<String> xmlOutputFile = Optional.<String>absent();
+    private AccessModifier acessModifier = AccessModifier.PUBLIC;
 
     public String getNewArchive() {
         return newArchive;
@@ -39,4 +41,12 @@ public class Options {
     public void setXmlOutputFile(Optional<String> xmlOutputFile) {
         this.xmlOutputFile = xmlOutputFile;
     }
+
+    public void setAcessModifier(AccessModifier acessModifier) {
+        this.acessModifier = acessModifier;
+    }
+
+    public AccessModifier getAcessModifier() {
+        return acessModifier;
+    }
 }
diff --git a/japicmp/src/main/java/japicmp/model/JApiClass.java b/japicmp/src/main/java/japicmp/model/JApiClass.java
index e1d429f..242b6c3 100644
--- a/japicmp/src/main/java/japicmp/model/JApiClass.java
+++ b/japicmp/src/main/java/japicmp/model/JApiClass.java
@@ -1,6 +1,7 @@
 package japicmp.model;
 
 import com.google.common.base.Optional;
+import japicmp.cmp.AccessModifier;
 import javassist.CtClass;
 
 import javax.xml.bind.annotation.XmlAttribute;
@@ -16,17 +17,21 @@ public class JApiClass {
     private List<JApiMethod> methods = new LinkedList<JApiMethod>();
     private JApiChangeStatus changeStatus;
     private final Type type;
+    private Optional<AccessModifier> accessModifierOld;
+    private Optional<AccessModifier> accessModifierNew;
 
     public enum Type {
         ANNOTATION, INTERFACE, CLASS, ENUM
     }
 
-    public JApiClass(String fullyQualifiedName, Optional<CtClass> oldClass, Optional<CtClass> newClass, JApiChangeStatus changeStatus, Type type) {
+    public JApiClass(String fullyQualifiedName, Optional<CtClass> oldClass, Optional<CtClass> newClass, JApiChangeStatus changeStatus, Type type, Optional<AccessModifier> oldModifierLevel, Optional<AccessModifier> newModifierLevel) {
         this.changeStatus = changeStatus;
         this.fullyQualifiedName = fullyQualifiedName;
         this.newClass = newClass;
         this.oldClass = oldClass;
         this.type = type;
+        this.accessModifierOld = oldModifierLevel;
+        this.accessModifierNew = newModifierLevel;
     }
 
     public void addMethod(JApiMethod jApiMethod) {
@@ -71,6 +76,22 @@ public class JApiClass {
         return type;
     }
 
+    @XmlAttribute(name = "accessModifierNew")
+    public String getAccessModifierNew() {
+        if(this.accessModifierNew.isPresent()) {
+            return this.accessModifierNew.get().toString();
+        }
+        return "n.a.";
+    }
+
+    @XmlAttribute(name = "accessModifierOld")
+    public String getAccessModifierOld() {
+        if(this.accessModifierOld.isPresent()) {
+            return this.accessModifierOld.get().toString();
+        }
+        return "n.a.";
+    }
+
     @Override
     public String toString() {
         return "JApiClass{" +
diff --git a/japicmp/src/main/java/japicmp/model/JApiMethod.java b/japicmp/src/main/java/japicmp/model/JApiMethod.java
index ab04e1f..b23c44a 100644
--- a/japicmp/src/main/java/japicmp/model/JApiMethod.java
+++ b/japicmp/src/main/java/japicmp/model/JApiMethod.java
@@ -1,6 +1,7 @@
 package japicmp.model;
 
 import com.google.common.base.Optional;
+import japicmp.cmp.AccessModifier;
 import javassist.CtMethod;
 
 import javax.xml.bind.annotation.XmlAttribute;
@@ -15,14 +16,18 @@ public class JApiMethod {
     private final Optional<CtMethod> oldMethod;
     private final Optional<CtMethod> newMethod;
     private final String returnType;
+    private Optional<AccessModifier> accessModifierOld;
+    private Optional<AccessModifier> accessModifierNew;
     private final List<JApiParameter> parameters = new LinkedList<JApiParameter>();
 
-    public JApiMethod(String name, JApiChangeStatus changeStatus, Optional<CtMethod> oldClass, Optional<CtMethod> newClass, String returnType) {
+    public JApiMethod(String name, JApiChangeStatus changeStatus, Optional<CtMethod> oldClass, Optional<CtMethod> newClass, String returnType, Optional<AccessModifier> oldModifierLevel, Optional<AccessModifier> newModifierLevel) {
         this.name = name;
         this.changeStatus = changeStatus;
         this.oldMethod = oldClass;
         this.newMethod = newClass;
         this.returnType = returnType;
+        this.accessModifierOld = oldModifierLevel;
+        this.accessModifierNew = newModifierLevel;
     }
 
     @XmlAttribute
@@ -58,4 +63,20 @@ public class JApiMethod {
     public void addParameter(JApiParameter jApiParameter) {
         parameters.add(jApiParameter);
     }
+
+    @XmlAttribute(name = "accessModifierNew")
+    public String getAccessModifierNew() {
+        if(this.accessModifierNew.isPresent()) {
+            return this.accessModifierNew.get().toString();
+        }
+        return "n.a.";
+    }
+
+    @XmlAttribute(name = "accessModifierOld")
+    public String getAccessModifierOld() {
+        if(this.accessModifierOld.isPresent()) {
+            return this.accessModifierOld.get().toString();
+        }
+        return "n.a.";
+    }
 }
diff --git a/japicmp/src/main/java/japicmp/output/stdout/StdoutOutputGenerator.java b/japicmp/src/main/java/japicmp/output/stdout/StdoutOutputGenerator.java
index e379095..b981804 100644
--- a/japicmp/src/main/java/japicmp/output/stdout/StdoutOutputGenerator.java
+++ b/japicmp/src/main/java/japicmp/output/stdout/StdoutOutputGenerator.java
@@ -57,7 +57,7 @@ public class StdoutOutputGenerator {
         int paramCount = 0;
         for (JApiParameter jApiParameter : jApiMethod.getParameters()) {
             if (paramCount > 0) {
-                sb.append(",");
+                sb.append(", ");
             }
             sb.append(jApiParameter.getType());
             paramCount++;
diff --git a/japicmp/src/main/java/japicmp/util/ModifierHelper.java b/japicmp/src/main/java/japicmp/util/ModifierHelper.java
new file mode 100644
index 0000000..416888e
--- /dev/null
+++ b/japicmp/src/main/java/japicmp/util/ModifierHelper.java
@@ -0,0 +1,29 @@
+package japicmp.util;
+
+import japicmp.cmp.AccessModifier;
+
+import java.lang.reflect.Modifier;
+
+public class ModifierHelper {
+
+    private ModifierHelper() {
+
+    }
+
+    public static boolean matchesModifierLevel(int modifierOfElement, AccessModifier modifierLevel) {
+        AccessModifier modifierLevelOfElement = translateToModifierLevel(modifierOfElement);
+        return (modifierLevelOfElement.getLevel() >= modifierLevel.getLevel());
+    }
+
+    public static AccessModifier translateToModifierLevel(int modifier) {
+        if(Modifier.isPublic(modifier)) {
+            return AccessModifier.PUBLIC;
+        } else if(Modifier.isProtected(modifier)) {
+            return AccessModifier.PROTECTED;
+        } else if(Modifier.isPrivate(modifier)) {
+            return AccessModifier.PRIVATE;
+        } else {
+            return AccessModifier.PACKAGE;
+        }
+    }
+}
diff --git a/japicmp/src/test/java/japicmp/util/ModifierHelperTest.java b/japicmp/src/test/java/japicmp/util/ModifierHelperTest.java
new file mode 100644
index 0000000..4f0b95f
--- /dev/null
+++ b/japicmp/src/test/java/japicmp/util/ModifierHelperTest.java
@@ -0,0 +1,41 @@
+package japicmp.util;
+
+import japicmp.cmp.AccessModifier;
+import javassist.Modifier;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class ModifierHelperTest {
+
+    @Test
+    public void publicToPublic() {
+        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPublic(0), AccessModifier.PUBLIC), is(true));
+    }
+
+    @Test
+    public void publicToProtected() {
+        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPublic(0), AccessModifier.PROTECTED), is(true));
+    }
+
+    @Test
+    public void publicToPrivate() {
+        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPublic(0), AccessModifier.PRIVATE), is(true));
+    }
+
+    @Test
+    public void privateToPublic() {
+        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPrivate(0), AccessModifier.PUBLIC), is(false));
+    }
+
+    @Test
+    public void privateToProtected() {
+        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPrivate(0), AccessModifier.PROTECTED), is(false));
+    }
+
+    @Test
+    public void privateToPrivate() {
+        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPrivate(0), AccessModifier.PRIVATE), is(true));
+    }
+}