Birger Birger - 4 months ago 55
Java Question

What kind of sorcery is Maven doing to run this project, when I can't?

I have a maven project with some library dependencies (.dll) (which I put in a "lib" folder). I can run the project without problems in Netbeans, but when I try to run the built .jar outside of Netbeans, I get the following error on loading the library:

Can't load this .dll (machine code=0xbd) on a AMD 64-bit platform


I only have one instance of Java installed on my computer, it should be the same JVM that Netbeans/Maven uses to run the project. So I can't understand how Netbeans/Maven is able to run this application on a different platform than me? I've tried looking at the command Netbeans executes (from the output) to run the project and I think it's this:

cd C:\Users\Birger\Workspace\myproject; "JAVA_HOME=C:\\Program Files\\Java\\jdk1.8.0_91" cmd /c "\"\"C:\\Program Files\\NetBeans 8.1\\java\\maven\\bin\\mvn.bat\" -Dexec.args=\"-Djava.library.path=lib\\ -classpath %classpath com.mysite.myproject.Main\" -Dexec.executable=\"C:\\Program Files\\Java\\jdk1.8.0_91\\bin\\java.exe\" -Dmaven.ext.class.path=\"C:\\Program Files\\NetBeans 8.1\\java\\maven-nblib\\netbeans-eventspy.jar\" -Dfile.encoding=UTF-8 org.codehaus.mojo:exec-maven-plugin:1.2.1:exec\""


I tried these two commands

"C:\Program Files\Java\jdk1.8.0_91\jre\bin\java.exe" -Djava.library.path=lib\ -jar myproject-1.0-SNAPSHOT.jar
"C:\Program Files\Java\jdk1.8.0_91\bin\java.exe" -Djava.library.path=lib\ -jar myproject-1.0-SNAPSHOT.jar


I added
System.out.println(System.getProperty("sun.arch.data.model"));
to get my application to print out the cpu architecture. It prints
64
in both occasions.

Tried looking into the "mvn.bat" file in
C:\Program Files\NetBeans 8.1\java\maven\bin\mvn.bat
but I couldn't find any clues as to what Maven is doing to run my application.

Can somebody help me on this one?

Birger

EDIT

Here's the complete source code of my test project. My project's
pom.xml


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mysite</groupId>
<artifactId>myproject</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<repositories>
<repository>
<id>repo</id>
<url>file://${project.basedir}/temp-repo</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>jni4net</groupId>
<artifactId>jni4net.j</artifactId>
<version>0.8.8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.mysite.myproject.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<resources>
<resource>
<directory>lib</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>


My project's class

package com.mysite.myproject;

import java.io.File;
import java.io.IOException;
import net.sf.jni4net.Bridge;

public class Main {

static {
String libDir = System.getProperty("java.library.path");
System.loadLibrary("jni4net.n-0.8.8.0");

if (System.getProperty("sun.arch.data.model").equals("64")) {
System.loadLibrary("jni4net.n.w64.v20-0.8.8.0");
System.loadLibrary("jni4net.n.w64.v40-0.8.8.0");
} else {
System.loadLibrary("jni4net.n.w32.v20-0.8.8.0");
System.loadLibrary("jni4net.n.w32.v40-0.8.8.0");
}

try {
Bridge.init(new File(libDir));
System.out.println("Initialized!");
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
new Main();
}

public Main() {
System.out.println("Hello world!");
}
}


Netbeans output when running the project (added
--debug
option for verbose output):

cd C:\Users\Birger\Workspace\myproject; "JAVA_HOME=C:\\Program Files\\Java\\jdk1.8.0_91" cmd /c "\"\"C:\\Program Files\\NetBeans 8.1\\java\\maven\\bin\\mvn.bat\" -Dexec.args=\"-Djava.library.path=lib\\ -classpath %classpath com.mysite.myproject.Main\" -Dexec.executable=\"C:\\Program Files\\Java\\jdk1.8.0_91\\bin\\java.exe\" -Dmaven.ext.class.path=\"C:\\Program Files\\NetBeans 8.1\\java\\maven-nblib\\netbeans-eventspy.jar\" -Dfile.encoding=UTF-8 --debug org.codehaus.mojo:exec-maven-plugin:1.2.1:exec\""
Running NetBeans Compile On Save execution. Phase execution is skipped and output directories of dependency projects (with Compile on Save turned on) will be used instead of their jar artifacts.
C:\Program Files\Java\jdk1.8.0_91
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 14:51:28+0100)
Maven home: C:\Program Files\NetBeans 8.1\java\maven
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_91\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
Populating class realm maven.ext
Included C:\Program Files\NetBeans 8.1\java\maven-nblib\netbeans-eventspy.jar
Error stacktraces are turned on.
Reading global settings from C:\Program Files\NetBeans 8.1\java\maven\conf\settings.xml
Reading user settings from C:\Users\Birger\.m2\settings.xml
Using local repository at C:\Users\Birger\.m2\repository
Using manager EnhancedLocalRepositoryManager with priority 10 for C:\Users\Birger\.m2\repository
Scanning for projects...
Extension realms for project com.mysite:myproject:jar:1.0-SNAPSHOT: (none)
Looking up lifecyle mappings for packaging jar from ClassRealm[maven.ext, parent: ClassRealm[plexus.core, parent: null]]
=== REACTOR BUILD PLAN ================================================
Project: com.mysite:myproject:jar:1.0-SNAPSHOT
Tasks: [org.codehaus.mojo:exec-maven-plugin:1.2.1:exec]
Style: Regular
=======================================================================

------------------------------------------------------------------------
Building myproject 1.0-SNAPSHOT
------------------------------------------------------------------------
Lifecycle default -> [validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy]
Lifecycle clean -> [pre-clean, clean, post-clean]
Lifecycle site -> [pre-site, site, post-site, site-deploy]
=== PROJECT BUILD PLAN ================================================
Project: com.mysite:myproject:1.0-SNAPSHOT
Dependencies (collect): []
Dependencies (resolve): [test]
Repositories (dependencies): [libs-release (http://artifactory.osc.no:8081/artifactory/libs-release/, releases), repo (file://C:\Users\Birger\Workspace\myproject/temp-repo, releases+snapshots), central (http://repo.maven.apache.org/maven2, releases)]
Repositories (plugins) : [libs-release (http://artifactory.osc.no:8081/artifactory/libs-release/, releases), central (http://repo.maven.apache.org/maven2, releases)]
-----------------------------------------------------------------------
Goal: org.codehaus.mojo:exec-maven-plugin:1.2.1:exec (default-cli)
Style: Regular
Configuration: <?xml version="1.0" encoding="UTF-8"?>
<configuration>
<basedir default-value="${basedir}"/>
<classpathScope default-value="runtime">${exec.classpathScope}</classpathScope>
<commandlineArgs>${exec.args}</commandlineArgs>
<executable>${exec.executable}</executable>
<longClasspath default-value="false">${exec.longClasspath}</longClasspath>
<outputFile>${exec.outputFile}</outputFile>
<project default-value="${project}"/>
<session default-value="${session}"/>
<skip default-value="false">${skip}</skip>
<sourceRoot>${sourceRoot}</sourceRoot>
<testSourceRoot>${testSourceRoot}</testSourceRoot>
<workingDirectory>${exec.workingdir}</workingDirectory>
</configuration>
=======================================================================
com.mysite:myproject:jar:1.0-SNAPSHOT
jni4net:jni4net.j:jar:0.8.8.0:compile

--- exec-maven-plugin:1.2.1:exec (default-cli) @ myproject ---
Created new class realm maven.api
Importing foreign packages into class realm maven.api
Imported: org.apache.maven.cli < maven.ext
Imported: org.codehaus.plexus.lifecycle < maven.ext
Imported: org.apache.maven.lifecycle < maven.ext
Imported: org.apache.maven.repository < maven.ext
Imported: org.codehaus.plexus.personality < maven.ext
Imported: org.apache.maven.usability < maven.ext
Imported: org.codehaus.plexus.configuration < maven.ext
Imported: org.sonatype.aether.version < maven.ext
Imported: org.sonatype.aether.* < maven.ext
Imported: org.sonatype.aether.artifact < maven.ext
Imported: org.apache.maven.* < maven.ext
Imported: org.apache.maven.project < maven.ext
Imported: org.sonatype.aether.repository < maven.ext
Imported: org.sonatype.aether.impl < maven.ext
Imported: org.apache.maven.exception < maven.ext
Imported: org.apache.maven.plugin < maven.ext
Imported: org.sonatype.aether.collection < maven.ext
Imported: org.codehaus.plexus.* < maven.ext
Imported: org.codehaus.plexus.logging < maven.ext
Imported: org.apache.maven.profiles < maven.ext
Imported: org.sonatype.aether.metadata < maven.ext
Imported: org.sonatype.aether.spi < maven.ext
Imported: org.codehaus.plexus.util.xml.pull.XmlPullParserException < maven.ext
Imported: org.apache.maven.wagon.* < maven.ext
Imported: org.sonatype.aether.graph < maven.ext
Imported: org.apache.maven.rtinfo < maven.ext
Imported: org.sonatype.aether.installation < maven.ext
Imported: org.apache.maven.monitor < maven.ext
Imported: org.sonatype.aether.transfer < maven.ext
Imported: org.codehaus.plexus.context < maven.ext
Imported: org.apache.maven.wagon.observers < maven.ext
Imported: org.apache.maven.wagon.resource < maven.ext
Imported: org.sonatype.aether.deployment < maven.ext
Imported: org.apache.maven.model < maven.ext
Imported: org.codehaus.plexus.util.xml.Xpp3Dom < maven.ext
Imported: org.apache.maven.artifact < maven.ext
Imported: org.apache.maven.toolchain < maven.ext
Imported: org.codehaus.plexus.util.xml.pull.XmlSerializer < maven.ext
Imported: org.apache.maven.settings < maven.ext
Imported: org.apache.maven.wagon.authorization < maven.ext
Imported: org.apache.maven.wagon.events < maven.ext
Imported: org.apache.maven.wagon.authentication < maven.ext
Imported: org.apache.maven.reporting < maven.ext
Imported: org.apache.maven.wagon.repository < maven.ext
Imported: org.apache.maven.configuration < maven.ext
Imported: org.codehaus.plexus.classworlds < maven.ext
Imported: org.codehaus.classworlds < maven.ext
Imported: org.codehaus.plexus.util.xml.pull.XmlPullParser < maven.ext
Imported: org.apache.maven.classrealm < maven.ext
Imported: org.sonatype.aether.resolution < maven.ext
Imported: org.apache.maven.execution < maven.ext
Imported: org.apache.maven.wagon.proxy < maven.ext
Imported: org.codehaus.plexus.container < maven.ext
Imported: org.codehaus.plexus.component < maven.ext
Populating class realm maven.api
org.codehaus.mojo:exec-maven-plugin:jar:1.2.1:
org.apache.maven:maven-toolchain:jar:1.0:compile
org.apache.maven:maven-project:jar:2.0.6:compile
org.apache.maven:maven-settings:jar:2.0.6:compile
org.apache.maven:maven-profile:jar:2.0.6:compile
org.apache.maven:maven-plugin-registry:jar:2.0.6:compile
org.apache.maven:maven-model:jar:2.0.6:compile
org.apache.maven:maven-artifact:jar:2.0.6:compile
org.apache.maven:maven-artifact-manager:jar:2.0.6:compile
org.apache.maven:maven-repository-metadata:jar:2.0.6:compile
org.apache.maven:maven-core:jar:2.0.6:compile
org.apache.maven:maven-plugin-parameter-documenter:jar:2.0.6:compile
org.apache.maven.reporting:maven-reporting-api:jar:2.0.6:compile
org.apache.maven.doxia:doxia-sink-api:jar:1.0-alpha-7:compile
org.apache.maven:maven-error-diagnostics:jar:2.0.6:compile
commons-cli:commons-cli:jar:1.0:compile
org.apache.maven:maven-plugin-descriptor:jar:2.0.6:compile
org.codehaus.plexus:plexus-interactivity-api:jar:1.0-alpha-4:compile
org.apache.maven:maven-monitor:jar:2.0.6:compile
classworlds:classworlds:jar:1.1:compile
org.apache.maven:maven-plugin-api:jar:2.0.6:compile
org.codehaus.plexus:plexus-utils:jar:2.0.5:compile
org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9:compile
junit:junit:jar:3.8.2:test (scope managed from compile) (version managed from 3.8.1)
org.apache.commons:commons-exec:jar:1.1:compile
Created new class realm plugin>org.codehaus.mojo:exec-maven-plugin:1.2.1
Importing foreign packages into class realm plugin>org.codehaus.mojo:exec-maven-plugin:1.2.1
Imported: < maven.api
Populating class realm plugin>org.codehaus.mojo:exec-maven-plugin:1.2.1
Included: org.codehaus.mojo:exec-maven-plugin:jar:1.2.1
Included: org.apache.maven.reporting:maven-reporting-api:jar:2.0.6
Included: org.apache.maven.doxia:doxia-sink-api:jar:1.0-alpha-7
Included: commons-cli:commons-cli:jar:1.0
Included: org.codehaus.plexus:plexus-interactivity-api:jar:1.0-alpha-4
Included: org.codehaus.plexus:plexus-utils:jar:2.0.5
Included: org.apache.commons:commons-exec:jar:1.1
Excluded: org.apache.maven:maven-toolchain:jar:1.0
Excluded: org.apache.maven:maven-project:jar:2.0.6
Excluded: org.apache.maven:maven-settings:jar:2.0.6
Excluded: org.apache.maven:maven-profile:jar:2.0.6
Excluded: org.apache.maven:maven-plugin-registry:jar:2.0.6
Excluded: org.apache.maven:maven-model:jar:2.0.6
Excluded: org.apache.maven:maven-artifact:jar:2.0.6
Excluded: org.apache.maven:maven-artifact-manager:jar:2.0.6
Excluded: org.apache.maven:maven-repository-metadata:jar:2.0.6
Excluded: org.apache.maven:maven-core:jar:2.0.6
Excluded: org.apache.maven:maven-plugin-parameter-documenter:jar:2.0.6
Excluded: org.apache.maven:maven-error-diagnostics:jar:2.0.6
Excluded: org.apache.maven:maven-plugin-descriptor:jar:2.0.6
Excluded: org.apache.maven:maven-monitor:jar:2.0.6
Excluded: classworlds:classworlds:jar:1.1
Excluded: org.apache.maven:maven-plugin-api:jar:2.0.6
Excluded: org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9
Excluded: junit:junit:jar:3.8.2
Configuring mojo org.codehaus.mojo:exec-maven-plugin:1.2.1:exec from plugin realm ClassRealm[plugin>org.codehaus.mojo:exec-maven-plugin:1.2.1, parent: sun.misc.Launcher$AppClassLoader@5c647e05]
Configuring mojo 'org.codehaus.mojo:exec-maven-plugin:1.2.1:exec' with basic configurator -->
(f) basedir = C:\Users\Birger\Workspace\myproject
(f) classpathScope = runtime
(f) commandlineArgs = -Djava.library.path=lib\ -classpath %classpath com.mysite.myproject.Main
(f) executable = C:\Program Files\Java\jdk1.8.0_91\bin\java.exe
(f) longClasspath = false
(f) project = MavenProject: com.mysite:myproject:1.0-SNAPSHOT @ C:\Users\Birger\Workspace\myproject\pom.xml
(f) session = org.apache.maven.execution.MavenSession@2ef14fe
(f) skip = false
-- end configuration --
Collected project artifacts [jni4net:jni4net.j:jar:0.8.8.0:compile]
Collected project classpath [C:\Users\Birger\Workspace\myproject\target\classes]
dealing with jni4net:jni4net.j:jar:0.8.8.0:compile
Toolchains are ignored, 'executable' parameter is set to C:\Program Files\Java\jdk1.8.0_91\bin\java.exe
Executing command line: C:\Program Files\Java\jdk1.8.0_91\bin\java.exe -Djava.library.path=lib\ -classpath C:\Users\Birger\Workspace\myproject\target\classes;C:\Users\Birger\.m2\repository\jni4net\jni4net.j\0.8.8.0\jni4net.j-0.8.8.0.jar com.mysite.myproject.Main
Initialized!
Hello world!
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 1.360s
Finished at: Fri Jul 08 09:26:48 CEST 2016
Final Memory: 5M/245M
------------------------------------------------------------------------


Command-line output when trying to run my built .jar

C:\Users\Birger\Workspace\myproject\target>"C:\Program Files\Java\jdk1.8.0_91\bin\java.exe" -Djava.library.path=lib\ -jar myproject-1.0-SNAPSHOT.jar
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\Birger\Workspace\myproject\target\lib\jni4net.n-0.8.8.0.dll: Can't load this .dll (machine code=0xbd) on a AMD 64-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at com.mysite.myproject.Main.<clinit>(Main.java:11)


EDIT2:

For anyone looking to reproduce this error, jni4net can be found here. I installed the .jar with this windows batch file:

set project_dir=YOURPROJECTDIRECTORYHERE
set proxygen_dir=YOURPROXYGENINSTALLATIONDIRECTORYHERE
set temp_repo_dir=%project_dir%\temp-repo
call mvn install:install-file -DlocalRepositoryPath=%temp_repo_dir% -DcreateChecksum=true -Dpackaging=jar -Dfile=%proxygen_dir%\lib\jni4net.j-0.8.8.0.jar -DgroupId=jni4net -DartifactId=jni4net.j -Dversion=0.8.8.0


EDIT3:

I installed 32-bit JVM, and tried running the application with the following command:

"C:\Program Files (x86)\Java\jre1.8.0_91\bin\java.exe" -Djava.library.path=lib\ -jar myproject-1.0-SNAPSHOT.jar


Now I get:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\Birger\Workspace\myproject\target\lib\jni4net.n.w32.v20-0.8.8.0.dll: Can't load this .dll (machine code=0xbd) on a IA 32-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at com.mysite.myproject.Main.<clinit>(Main.java:19)


I'm getting quite desperate here (and a little frustrated with Java tbh)

EDIT4:

Tried these commands, also not working:

"C:\Program Files\Java\jdk1.8.0_91\bin\java" -Djava.library.path=lib\ -classpath C:\Users\Birger\Workspace\myproject\target\classes;C:\Users\Birger\.m2\repositor‌​y\jni4net\jni4net.j\0.8.8.0\jni4net.j-0.8.8.0.jar com.mysite.myproject.Main
"C:\Program Files\Java\jdk1.8.0_91\bin\java" -Djava.library.path=lib\ -classpath classes;C:\Users\Birger\.m2\repositor‌​y\jni4net\jni4net.j\0.8.8.0\jni4net.j-0.8.8.0.jar com.mysite.myproject.Main
"C:\Program Files\Java\jdk1.8.0_91\bin\java" -Djava.library.path=lib\ -classpath classes com.mysite.myproject.Main

Answer

I have faced this problem long time ago.

just remove the <filtering>true</filtering> ,this get the files corrupted while copying. (Bug !!???).

I was able to reproduce your issue. this will resolve your problem also

hope this helps.