I know that Maven houses the outcome of the build in the local repository (artifacts goes installed under ~/.m2/repository/
), but it also outputs the compiled classes in the target
folder next to src
.
Is there any difference between what goes in the local repository and what goes in the target
folder?
A folder, hardcopy or electronic, containing target intelligence and related materials prepared for planning and executing action against a specific target.
The target directory is used to house all output of the build. The src directory contains all of the source material for building the project, its site and so on. It contains a subdirectory for each type: main for the main build artifact, test for the unit test code and resources, site and so on.
The maven targets are located in your project config/ folder.
The src/target folder is where IntelliJ will keep the compiled versions of your Scala application files. As such, the files and folders within the target directory is automatically managed by IntelliJ and you should not place any of your application files here.
They are completely different and shouldn't be mixed up.
target
represents the build directory. This is to say, every temporary file that is generated during the build from the sources ends up there. Quite notably, you'll find the compiled classes of the main and test Java sources, but you'll also find lots of things in there (generated source files, filtered files, etc.). What matters, is that everything that is contained in this folder is inherently temporary. You can delete it at any time, running mvn clean
, and be assured that the next build will (or at least should) work just fine. All the files and folders generated under target
serve a single purpose: create the artifacts of the project. A Maven project, for example with jar
packaging, will have a single main artifact, which is composed of its final name with a jar
extension, and will contain the compiled Java classes. The final name can be a custom name, set within the POM, or the default one derived from the Maven coordinates of the project. Such a project can also have additional attached artifacts, like a test JAR, or a sources JAR.
The local repository only contains the artifacts. There are no temporary files in there. What is installed when running mvn install
is strictly the generated artifacts of the Maven project, i.e. the end products, plus the POM file of the project. Everything that served to create them isn't put in the local repository, and the build of a project must never put temporary things in there. Keep in mind that the local repository is a Maven repository, and, as such, follows a strict naming scheme: a project with a group id of my.groupid
, an artifact id of my-artifactid
and a version of 1.0
will get installed in the folder my/groupid/my-artifactid/1.0
; in which you'll find the POM file, and all the other artifacts. The name of the artifacts themselves cannot be overriden: it will be my-artifactid-1.0.jar
for a JAR project (perhaps with a classifier added).
This is generally a source of confusion: the name of the main artifact file that is generated under the target
folder is completely distinct from the name that it will have in the local repository when installed, or in remote repositories when deployed. The first can be controlled, but the latter is defined by the naming scheme of the repository, which is calculated from the coordinates.
To recap: target
contains all the gory temporary details during the build which creates the artifacts of a project (main JAR, sources, Javadoc... i.e. everything that is supposed to be deployed and released by that project), while the local repository (and remote repositories) will contain only the artifacts themselves.
Not much in terms of the generated module.jar
if that's what you are really concern about. The .jar generated is the same, also considering recompiling the code would clean your /target
folder but not the .m2
one.
Though /target
folder would generally be composed of the compiled source classes /target/classes
and /target/generated-source
etc along with a module.jar
.
On the other hand the local ~.m2/repository
would consist of module.jar
along with the pom.xml
for that module and all the configs(repositories
, dependencies
etc) to rebuild that module from if required.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With