Symptoms
When Clover is enabled compilation fails with a missing type error, for example:
[javac] /workspace/com/samples/OtherClass.java:11: cannot find symbol [javac] symbol : variable BuildTime [javac] location: class com.samples.OtherClass [javac] __CLR4_0_3b0b0i9zeh8ey.R.inc(397);System.out.println(BuildTime.BUILD_TIME); [javac] ^ [javac] 1 error
Cause
Errors related with a missing symbol might occur when:
- you have source code generation integrated with your build process and
- sources are being generated after Clover's instrumentation
For example, if you have a Maven-based build and you use maven-antrun-plugin or maven-exec-plugin to generate source files:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <copy file="${project.build.sourceDirectory}/com/samples/BuildTime.java.gen." tofile="${project.build.sourceDirectory}/com/samples/BuildTime.java" overwrite="true"/> </target> </configuration> </execution> </executions> </plugin>
and you run standard Clover instrumentation, such as:
mvn clean clover:setup test clover:clover clover:aggregate
Clover's code instrumentation (clover:setup) will occur before code generation (as the 'generate-sources' phase will be triggered by the 'test' phase). Clover will also change source roots (e.g. from 'src/main/java' to 'target/clover/src-instrumented'). As a consequence, the BuildTime.java file will be written to an old source root ('src/main/java') and will not be compiled at all.
Resolution
Please verify if your build process contains any code/resource generation. If it does, make sure that
- Clover is initialized and sources are instrumented after all files are have already been generated
- or ensure that generated sources will be copied to folder(s) containing instrumented files.
You can either do it in a command line:
mvn clean generate-sources clover:setup test
or you can bind the 'clover:setup' to a build phase which happens after the 'generate-sources' one:
<plugin> <groupId>com.atlassian.maven.plugins</groupId> <artifactId>clover-maven-plugin</artifactId> <executions> <execution> <phase>process-sources</phase> <goals> <goal>setup</goal> </goals> </execution> </executions> </plugin>