运行 我生成的 .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>
我有一个项目正在使用一些本机库 (.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>