How to call a SO native library while package with maven? - java

I have developed a project with swing, maven with some native libraries. Now i have an issue with calling SO from java after generating jar from maven package. I included so in POM.xml. And it included that file inside jar.But it wont link both.
I had an error while executing jar like
" Exception in thread "main" java.lang.UnsatisfiedLinkError: no projectso in java.library.path"
<resources>
<resource>
<filtering>false</filtering>
<directory>${project.basedir}/lib</directory>
<includes>
<include>my.so</include>
<include>cv2.so</include>
</includes>
</resource>
</resources>
And also want to add library folder and export it into jar.Is there any way to do it?

Your native library path is not correct for your program to run. see Call c function from Java
use -Djava.library.path=/path/to/libs to set the path before executing the program.
use System.loadLibrary("HelloWorld") to set the path in runtime
please take look at the link I post again.

Related

Javazoom MP3 Player does not work outside of Netbeans IDE

i'am using the Player class from javazoom (javazoom.jl.player.Player) to play mp3 files. From within my Netbeans IDE (version 7.4), sounds are played successfully. But as soon i start my program from outside the IDE, sounds are not played anymore!
Does anyone know what the reason could be?
PS: Both, Netbeans IDE and Java environment outside in windows uses the same java framework: Java 1.7.0_40
Thank you
i guess i have solved it now with two steps:
1.) I used the MP3 SPI from http://www.javazoom.net/mp3spi/sources.html to play sounds
2.) I have a Netbeans maven project and i use filtering in case of resources, so i have to exclude the folder where sounds are saved, otherwise the sound files become corrupted when Netbeans is copying files to target folder and are not recognized as mp3 files anymore:
<resources>
<resource>
<directory>resources</directory>
<targetPath>../resources</targetPath>
<filtering>true</filtering>
<excludes>
<exclude>data/sounds/**</exclude>
</excludes>
</resource>
<resource>
<directory>resources</directory>
<targetPath>../resources</targetPath>
<filtering>false</filtering>
<includes>
<include>data/sounds/**</include>
</includes>
</resource>
</resources>
Now, even short mp3 files works as expected!

Add generated build file to classpath

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

ImplementedVersion is not accessible in exec:java target

I have used this how2 to add the Version number to our produkt: http://www.christophkiehl.com/easy-way-to-display-your-apps-version-using-maven-and-manifest
when i now build a jar with mvn assembly:single i see the correct version.
But when i just run everything with mvn exec:java i get null...
what do i have to do that App.class.getPackage().getImplementationVersion() does not return null when i just start the programm from the non-jar?
The technique that you have used to add version number works only when built as a jar.
A different way to achieve the same would be to have a properties file which gets updated with the project version during build, which in turn is read by your java code.
Say, you have a file version.properties in src/main/resources, which has an entry
product.version=${project.version}
In the place you call App.class.getPackage().getImplementationVersion(), you read this property and display the contents.
This will work in both jar and non-jar case.
Update: You would need to update the pom to enable filtering for resources - essentially add a snippet like the below (refer this for details).
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>

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