[ https://jira.codehaus.org/browse/MPMD-178?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Michael Yates updated MPMD-178: ------------------------------- Description: We are using PMD to check an Android project. The pom file that "drives" the Android project uses android-maven-plugin (3.8.2). Our android project depends on a number of 3rd party libraries. Some of these libraries are apklibs. The android-maven-plugin handles apklibs by expanding them into a given directory before compiling. This results in a very long value being passed to maven-pmd in the compileSourceRoots variable. I understand you can't override compileSourceRoots so I turned to excludeRoots to exclude these 3rd parties libraries from analysis The target directories that contain source in an maven Android project would look something like: {code:xml} /target/generated-sources/extracted-dependencies/src/main/java /target/generated-sources/r /target/generated-sources/aidl /target/unpacked-libs/com.actionbarsherlock_actionbarsherlock_apklib_4.3.0/src /target/unpacked-libs/com.github.chrisbanes.pulltorefresh_library_apklib_2.1.2-SNAPSHOT/src /target/unpacked-libs/com.slidingmenu_slidingmenu_apklib_1.3-SNAPSHOT/src {code} So you would hope that the maven-pmd plugin could be configured as <excludeRoots> <excludeRoot>target/generated-sources</excludeRoot> <excludeRoot>target/unpacked-libs</excludeRoot> </excludeRoots> However this doesn't work. The excludeRoots get compared directly for equality in the contains clause of if ( sourceDirectory.isDirectory() && !excludeRootFiles.contains( sourceDirectory ) ) in AbstractPmdReport.java. THis obviously doesn't work as unpacked-libs is the container for a whole host of source directories. I suggest that the comparison should look at the base path as --- private boolean isDirectoryExcluded(Collection<File> excludeRootFiles, File sourceDirectoryToCheck) { boolean returnVal = false; for (File excludeDir : excludeRootFiles) { if (sourceDirectoryToCheck.getAbsolutePath().startsWith(excludeDir.getAbsolutePath())) { getLog().debug( "Directory " +sourceDirectoryToCheck.getAbsolutePath() + " has been excluded as it matches excludeRoot " + excludeDir.getAbsolutePath()); returnVal = true; break; } } return returnVal; } --- With the comparison line becoming if (sourceDirectory.isDirectory() && !isDirectoryExcluded(excludeRootFiles, sourceDirectory) ) This is working in my test project and doesn't fail any of the maven-pmd unit tests. was: We are using PMD to check an Android project. The pom file that "drives" the Android project uses android-maven-plugin (3.8.2). Our android project depends on a number of 3rd party libraries. Some of these libraries are apklibs. The android-maven-plugin handles apklibs by expanding them into a given directory before compiling. This results in a very long value being passed to maven-pmd in the compileSourceRoots variable. I understand you can't override compileSourceRoots so I turned to excludeRoots to exclude these 3rd parties libraries from analysis The target directories that contain source in an maven Android project would look something like: /target/generated-sources/extracted-dependencies/src/main/java /target/generated-sources/r /target/generated-sources/aidl /target/unpacked-libs/com.actionbarsherlock_actionbarsherlock_apklib_4.3.0/src /target/unpacked-libs/com.github.chrisbanes.pulltorefresh_library_apklib_2.1.2-SNAPSHOT/src /target/unpacked-libs/com.slidingmenu_slidingmenu_apklib_1.3-SNAPSHOT/src So you would hope that the maven-pmd plugin could be configured as <excludeRoots> <excludeRoot>target/generated-sources</excludeRoot> <excludeRoot>target/unpacked-libs</excludeRoot> </excludeRoots> However this doesn't work. The excludeRoots get compared directly for equality in the contains clause of if ( sourceDirectory.isDirectory() && !excludeRootFiles.contains( sourceDirectory ) ) in AbstractPmdReport.java. THis obviously doesn't work as unpacked-libs is the container for a whole host of source directories. I suggest that the comparison should look at the base path as --- private boolean isDirectoryExcluded(Collection<File> excludeRootFiles, File sourceDirectoryToCheck) { boolean returnVal = false; for (File excludeDir : excludeRootFiles) { if (sourceDirectoryToCheck.getAbsolutePath().startsWith(excludeDir.getAbsolutePath())) { getLog().debug( "Directory " +sourceDirectoryToCheck.getAbsolutePath() + " has been excluded as it matches excludeRoot " + excludeDir.getAbsolutePath()); returnVal = true; break; } } return returnVal; } --- With the comparison line becoming if (sourceDirectory.isDirectory() && !isDirectoryExcluded(excludeRootFiles, sourceDirectory) ) This is working in my test project and doesn't fail any of the maven-pmd unit tests. > excludeRoots doesn't handle subdirectories (PMD doesn't isn't working nicely > with Android projects) > --------------------------------------------------------------------------------------------------- > > Key: MPMD-178 > URL: https://jira.codehaus.org/browse/MPMD-178 > Project: Maven PMD Plugin > Issue Type: Bug > Components: PMD > Affects Versions: 3.0.1 > Environment: all > Reporter: Michael Yates > > We are using PMD to check an Android project. The pom file that "drives" the > Android project uses android-maven-plugin (3.8.2). > Our android project depends on a number of 3rd party libraries. Some of these > libraries are apklibs. The android-maven-plugin handles apklibs by expanding > them into a given directory before compiling. > This results in a very long value being passed to maven-pmd in the > compileSourceRoots variable. I understand you can't override > compileSourceRoots so I turned to excludeRoots to exclude these 3rd parties > libraries from analysis > The target directories that contain source in an maven Android project would > look something like: > {code:xml} > /target/generated-sources/extracted-dependencies/src/main/java > /target/generated-sources/r > /target/generated-sources/aidl > /target/unpacked-libs/com.actionbarsherlock_actionbarsherlock_apklib_4.3.0/src > /target/unpacked-libs/com.github.chrisbanes.pulltorefresh_library_apklib_2.1.2-SNAPSHOT/src > /target/unpacked-libs/com.slidingmenu_slidingmenu_apklib_1.3-SNAPSHOT/src > {code} > So you would hope that the maven-pmd plugin could be configured as > <excludeRoots> > <excludeRoot>target/generated-sources</excludeRoot> > <excludeRoot>target/unpacked-libs</excludeRoot> > </excludeRoots> > However this doesn't work. > The excludeRoots get compared directly for equality in the contains clause of > if ( sourceDirectory.isDirectory() && !excludeRootFiles.contains( > sourceDirectory ) ) > in AbstractPmdReport.java. THis obviously doesn't work as unpacked-libs is > the container for a whole host of source directories. > I suggest that the comparison should look at the base path as > --- > private boolean isDirectoryExcluded(Collection<File> excludeRootFiles, > File sourceDirectoryToCheck) > { > boolean returnVal = false; > for (File excludeDir : excludeRootFiles) > { > if > (sourceDirectoryToCheck.getAbsolutePath().startsWith(excludeDir.getAbsolutePath())) > { > getLog().debug( "Directory " > +sourceDirectoryToCheck.getAbsolutePath() + " has been excluded as it matches > excludeRoot " + excludeDir.getAbsolutePath()); > returnVal = true; > break; > } > } > return returnVal; > } > --- > With the comparison line becoming > if (sourceDirectory.isDirectory() && !isDirectoryExcluded(excludeRootFiles, > sourceDirectory) ) > This is working in my test project and doesn't fail any of the maven-pmd unit > tests. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira