运行 我生成的 .jar 产生 "Can't load this .dll (machine code=0xbd) on a AMD 64-bit platform"

Running my generated .jar yields "Can't load this .dll (machine code=0xbd) on a AMD 64-bit platform"

我有一个项目正在使用一些本机库 (.dll)。我正在使用 Netbeans,并且在 运行 配置中指定了 java.library.path。 运行 来自 Netbeans 的项目没有产生任何错误。

我正在使用 Maven,在构建项目时,我的 jar 被构建在 target 文件夹中。我正在使用 Maven 资源和依赖插件将所有 .dll 和我的程序的依赖项复制到 target/lib

当我尝试 运行 我的 Netbeans 应用程序 "outside" 时,出现以下错误:

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

这是我用来 运行 .jar:

的命令
java -Djava.library.path=lib\ -jar abcontrol-1.0-SNAPSHOT.jar

这是 Netbeans 用于 运行 来自 IDE 项目的命令(我认为):

cd C:\Users\Birger\Workspace\myproject; "JAVA_HOME=C:\Program Files\Java\jdk1.8.0_77" 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_77\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\""

我在想 java 命令可能使用与 Netbeans 不同的 java 版本,所以我尝试了:

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

但是,我仍然遇到同样的错误。

如何在没有 Netbeans 的情况下 运行 我的应用程序?

编辑

根据对这个问题的回答:How can I tell if I'm running in 64-bit JVM or 32-bit JVM (from within a program)?,我添加了

System.out.println(System.getProperty("sun.arch.data.model"));

我的代码尝试打印 JVM 架构。我 运行 来自 Netbeans 和 "outside" netbeans 的应用程序,在这两种情况下它都打印了 64.

EDIT2

运行 java -version 打印

java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

EDIT3

我尝试使用相同的依赖项和库创建另一个项目。这次我没有使用 maven,在这个项目中,当我尝试 运行 项目时,我得到了同样的错误:

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

很明显,maven 正在施展魔法让这个项目达到 运行。

EDIT4(变得绝望)

尝试了运行这两个命令

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

两种产量

Error: This Java instance does not support a 32-bit JVM. Please install the desired version.

当我尝试 运行 由 Maven 构建的 JAR(但使用 32 位 DLL - Can't load this .dll (machine code=0xbd) on a IA 32-bit platform)时,我遇到了同样的问题。 奇怪的是:它发生在我将 DLL 移动到包含其他资源的文件夹中后,这些资源必须在构建期间复制。

我花了很长时间才发现 maven 资源插件出于某种原因正在更改 DLL 文件(可能是错误?)。原始 DLL 文件为 76 kb - 目标文件夹中复制的 DLL 为 118 kb。构建期间文件出现问题。

添加一个额外的执行来复制没有<filtering>true</filtering>的DLL文件解决了问题。

另一种替代解决方案是使用以下 post 中的建议: 这基本上是添加一个项目级别的配置,以便 Maven 在过滤资源时忽略二进制扩展:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
      ...
      <nonFilteredFileExtensions>
        <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
        <nonFilteredFileExtension>swf</nonFilteredFileExtension>
      </nonFilteredFileExtensions>
      ...
    </configuration>
  </plugin>