# Compiling your project successfully

For Diffblue Cover to write tests successfully, it needs your code to both compile and run. For the best results, your project needs to be completely built from the root. If this doesn't work, you may have an error in your built dependencies.

## Potential issues

Being able to execute your unit tests means that the following must be available:

* All **class** files that are produced by compilation of your project.
* All the dependencies (i.e. other modules in your project and **jar** files). Note that jar files contain class files and may, in turn, depend on other jar files.

These jar files are typically downloaded by your build system (e.g. Maven or Gradle).

(You also need the Java Class Library provided with your JDK, but Diffblue Cover will work out your JDK version and find the appropriate classes.)

### Class errors

Sometimes you might succeed in compiling your code, but when you run either your application or your tests you receive an error that a class was not found. This happens when dependencies are missing that were not necessary for compilation, but they are still required for execution.

"Class not found" errors indicate that the project wasn’t compiled correctly and/or that something is wrong or missing in your build configuration (e.g. pom.xml) or your Java environment. In these situations, Diffblue Cover is unable to run the unit tests it writes until you can fix these problems.

## Fixing build or compilation issues

First, ensure that you have compiled multi-module projects from the root, using a command such as:

```groovy
$ mvn clean install -DskipTests
```

*Please note that even though you can choose to run `dcover` from within one module you want to create tests for, you have to run the compilation command from the root of your project, not from within a module.*

### Example 1

The example below uses the multi-module Maven project JDMN. Download the project and switch to the release 3.10.0:

```groovy
git clone https://github.com/goldmansachs/jdmn
cd jdmn
git checkout 3.10.0
```

If we simply run `mvn compile` the project does not compile correctly, and dcover is unable to write tests. Use the command `mvn clean install -DskipTests` instead to compile the project and write tests successfully.

### Example 2

Another common mistake is to use the correct command but inside a module, for example:

```groovy
$ cd dmn-tck-it
$ mvn clean install -DskipTests

```

In this example, the compilation 'succeeds', but hides other problems. All the required dependencies were downloaded by Maven from the central repository. One of these dependencies was `dmn-core`, a module provided by the same project. But the version of that module that Maven downloaded may not match the code we have in the local module, or be able to compile it, e.g.

```groovy
$ ls ../dmn-core/target
ls: ../dmn-core/target: No such file or directory
```

This could be a problem if, for example, we make changes to `dmn-core`{: .language-plaintext} and expect the code in `dmn-tck-it`{: .language-plaintext} to exercise those changes.

To fix this, return to the project root and run `mvn clean install -DskipTests`{: .language-plaintext} from there:

```groovy
$ cd ..
$ mvn clean install -DskipTests
```

You can now either run `dcover` from the project root, or change directory into the module that you would like to create tests for, and run `dcover create`. If this still does not work, then please look at your build configuration.

### Finding errors in your build configuration

Typical problems arise from **system** scope dependencies and **exclusions**:

* **System scope dependencies** are sometimes used to bake commonly used dependencies into a prepared environment (e.g. server or CI image). So it could happen that these dependencies are not installed in your local environment. *The solution is to ensure that your local environment conforms to the runtime environment on your servers or CI system.*
* **Exclusions** specify that certain transitive dependencies should be excluded from your classpaths. It can happen that such an exclusion is incorrect, excluding classes that are actually needed. *The solution in this case is to find the faulty exclusion and fix your build configuration.*


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://cover-docs-preview.diffblue.com/features/cover-cli/project-configuration/compiling-your-project.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
