##### Overview

- Download PMD 5.0.4
- What's new in PMD 5.0.4
- PMD in the news
- PMD-related products and books
- Best practices
- Future directions
- Similar projects
- Credits
- License
- What does 'PMD' mean?

##### Usage

- Installation
- Command line usage
- Ant task usage
- Maven plugin usage
- Mvn plugin usage
- IDE plugin usage
- Suppressing warnings
- Finding duplicated code
- JSP support

##### Customizing PMD

- Compiling PMD
- How to write a rule
- Writing XPath rules
- How to make a rule set
- How it works
- Rule guidelines
- PMD developers information
- PMD Release Process

##### For example

- Run PMD on a Sourceforge project

##### Misc.

- XPath tutorial (Gregorian)

##### Rule Sets

- ecmascript
  - Basic Ecmascript
  - Braces
  - Unnecessary
- java
  - Android
  - Basic
  - Braces
  - Clone Implementation
  - Code Size
  - Comments
  - Controversial
  - Coupling
  - Design
  - Empty Code
  - Finalizer
  - Import Statements
  - J2EE
  - JavaBeans
  - JUnit
  - Jakarta Commons Logging
  - Java Logging
  - Migration
  - Naming
  - Optimization
  - Strict Exceptions
  - String and StringBuffer
  - Security Code Guidelines
  - Type Resolution
  - Unnecessary
  - Unused Code
- jsp
  - Basic JSF
  - Basic JSP
- xml
  - Basic XML
- xsl
  - XPath in XSL

##### Project Documentation

- Project Information
- Project Reports

## JavaBeans

The JavaBeans Ruleset catches instances of bean rules not being followed.

### BeanMembersShouldSerialize

Since: PMD 1.1

If a class is a bean, or is referenced by a bean directly or indirectly it needs to be serializable. Member variables need to be marked as transient, static, or have accessor methods in the class. Marking variables as transient is the safest and easiest modification. Accessor methods should follow the Java naming conventions, i.e. for a variable named foo, getFoo() and setFoo() accessor methods should be provided.

This rule is defined by the following Java class: net.sourceforge.pmd.lang.java.rule.javabeans.BeanMembersShouldSerializeRule

Example(s):

    private transient int someFoo;  // good, it's transient
    private static int otherFoo;    // also OK
    private int moreFoo;            // OK, has proper accessors, see below
    private int badFoo;             // bad, should be marked transient

    private void setMoreFoo(int moreFoo){
          this.moreFoo = moreFoo;
    }

    private int getMoreFoo(){
          return this.moreFoo;
    }

This rule has the following properties:

Name | Default Value | Description
--- | --- | ---
violationSuppressRegex |  | Suppress violations with messages matching a regular expression
violationSuppressXPath |  | Suppress violations on nodes which match a given relative XPath expression.
prefix |  | A variable prefix to skip, i.e., m_

### MissingSerialVersionUID

Since: PMD 3.0

Serializable classes should provide a serialVersionUID field.

    //ClassOrInterfaceDeclaration
     [
      count(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration
       /FieldDeclaration/VariableDeclarator/VariableDeclaratorId[@Image='serialVersionUID']) = 0
    and
      count(ImplementsList
       [ClassOrInterfaceType/@Image='Serializable'
       or ClassOrInterfaceType/@Image='java.io.Serializable']) =1
    and
       @Abstract = 'false'
    ]

Example(s):

    public class Foo implements java.io.Serializable {
     String name;
     // Define serialization id to avoid serialization related bugs
     // i.e., public static final long serialVersionUID = 4328743;
    }