Add generated build file to classpath - java

During my build I generate a build.properties files via the maven properties plugin (properties-maven-plugin) containing build information.
What's the best way to have this file included in the generated jar? I don't want to put it into the src/main/resources directory as this would pollute my default resource directory.
Is there not a "generated-resources" directory as there is with source?

I thought there was a default generated-resources directory, but I can't find any documentation on that at the moment. You can always configure additional resource directories in your pom:
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
</resource>
<resource>
<directory>${project.build.directory}/generated-resources</directory>
</resource>
</resources>
...
</build>

Place generated sources in target/generated-sources
There is a plugin called build-helper that allows you to add that folder to the source-folders list.

You can use maven assembly plugin to organize files and filesets in packages. have a look at http://maven.apache.org/plugins/maven-assembly-plugin/advanced-descriptor-topics.html
I think it is what you need.

you can output your files to any directory and add that resource directory to your <resources> of your <build>

You should put it in the target/classes directory
(fixed now from just target) and I think that this is better than the accepted one. As there is no need to process this resource as resource anymore

Related

Eclipse - maven warning when using parent project resources folder

I have parent ROOT maven project, it holds resources folder which every child project use using the following lines in pom.xml:
<build>
<resources>
<resource>
<directory>../ROOT/resources</directory>
</resource>
</resources>
But it produce a warning
Description Resource Path Location Type
Access "..\ROOT\resources" directory outside of project base directory. (org.apache.maven.plugins:maven-resources-plugin:2.6:resources:default-resources:process-resources) pom.xml /Proudct line 1 Maven Build Participant Problem
How to avoid such warning? is my setup wrong for sharing resources in child projects? or is it a false positive warning?
The best solution is to make a separate module which contains only the resources folder. All other modules which need the resources just define a dependency to that new module. The result is that the new module is on the classpath and the resources are accessible.

Include files in Maven JAR package

I have a maven project with the following structure:
project
-src
--main
---java
----(All my .java files are here in their packages)
---resource
----(All my resources are here)
-database (HSQLDB files)
--db.script
--db.properties
--db.data
-target
--Maven build directory
pom.xml
I want the maven jar plugin to package in the database folder when it builds a JAR file. I've tried including as outlined here: https://maven.apache.org/plugins/maven-jar-plugin/examples/include-exclude.html, but it doesn't find the directory "../database" (or ../../database OR ../../../database!), and also it now doesn't include any of the classes or resources (It was including them before).
So what should I have in the configuration of the maven jar plugin?
Which is the correct path to include and how do I keep the files it was including before?
Thanks
By default, only resources located in src/main/resources are added in the JAR.
What you tried to do by configuring the maven-jar-plugin defines only the filetset to exclude or include in the built JAR.
But these files still have to be located in a resources folder where Maven looks for resources.
So, you have two ways to solve your requirement:
move database in the standard directory : src/main/resources.
specifies two resource folders for resources :
To do the latter, in the pom.xml add in the build tag :
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>database-resources</directory>
</resource>
</resources>
Then add the database folder that you want package inside the database-resources.

How to add an external folder to the class path?

So I have the following folder structure:
Project
lib
(running jar from this folder)
properties (property file to load is in this folder)
I am trying to load a property file via X.class.getClassLoader().getResource("properties/fileName"). This method works in eclipse but when I build the jar using maven it fails to find the file, giving a file not found exception.
I suspect the folder is not in the classpath because if I run getClassLoader().getResources("") the property folder never shows up. I tried all the suggestions in previous questions on stackoverflow but none have worked so far.
I also tried running java -cp and -classpath but it still failed.
When using Maven, files like *.properties and any other not-compilable files must lie at src/main/resources folder, by default, to be available.
Additionally, I would recommend you to use Thread.currentThread().getContextClassLoader() to get a proper classloader, in order to load resources.
Anyway, if you want to have your custom folder at classpath, I suggest you to add as a resource, at the pom.xml, like this:
<project>
...
<build>
...
<resources>
<resource>
<!-- The folder you want to be a resource (from project root folder), like: project/properties -->
<directory>properties</directory>
<!-- Filtering if Maven should post-process text files to find and replace ${key} params: in most cases, leave it false -->
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>

How to make Maven copy resource file into WEB-INF/lib directory?

I'm using NewRelic for monitoring. I want Maven to package both newrelic.jar and newrelic.yaml files into my WEB-INF/lib inside the war file. With the newrelic.jar there is no problem since it's a simple dependency, but newrelic.yaml is a resource file. It resides in resources directory. I want Maven (war plugin) to copy it to WEB-INF/lib when packaging the war.
Thanks.
Alex
While I agree with #matt b that this is odd, here's what you can do:
Try changing the configuration of the maven war plugin to include a webResource:
<configuration>
<webResources>
<resource>
<directory>pathtoyaml</directory>
<includes>
<include>**/*.yaml</include>
</includes>
<targetPath>WEB-INF/lib</targetPath>
</resource>
</webResources>
</configuration>
The directory is relative to the pom.xml. See the plugin's documentation for more info.
You can also specify most configuration for the New Relic agent including the location of the config file via flags passed to the java command. In this case, it's something like:
-Dnewrelic.config.file=/etc/newrelic.yml
(ok, it's exactly like that, but you need to specify whatever path you need if it's not that.)
You should try adding .yaml file to newrelic.jar's resources, later
you can access it via classpath.
Or try changing/overriding build.xml build target by adding something like < copy file=".yaml"
todir="WEB-INF/lib" />
Try googling for more info on changing build.xml.

Can resource directory be a subdirectory of sources in maven?

I am trying to create a maven build for one of our legacy projects. Since one of the requirements is to be still compatible with the legacy ant build script I can't change the project directory structure.
The problem is the current directory structure which is as follows:
+ src
+ java
+ com
+ whatever
+ whatever2
+ resources (!)
My goal is to have source directory src/java and resource directory src/java/com/whatever/whatever2/resources.
Obviously I need to set <sourceDirectory>src/java</sourceDirectory>. This is fine.
But I would also need to make the resources maven resource directory. Trying the following:
<resources>
<resource>
<directory>src/java/com/whatever/whatever2/resources</directory>
</resource>
</resources>
But once I do this and run mvn clean package it gives me:
[INFO] No sources to compile
Once I remove the <resources> section the module is compiled just fine and have all the classes inside. Any tips on how to solve this? Thanks
We have a similar setup (XMBean descriptors next to the MBean implementations using them), but exclude java files from the resources:
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>

Categories