[
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