Java 运行生成的.jar会导致“无法在AMD 64位平台上加载此.dll(机器代码=0xbd)”

Java 运行生成的.jar会导致“无法在AMD 64位平台上加载此.dll(机器代码=0xbd)”,java,maven,netbeans,dll,cpu-architecture,Java,Maven,Netbeans,Dll,Cpu Architecture,我有一个项目正在使用一些本机库.dll。我正在使用Netbeans,并且在运行配置中指定了java.library.path。从Netbeans运行项目不会产生错误 我正在使用Maven,在构建项目时,我的jar构建在目标文件夹中。我正在使用maven资源和依赖插件将所有.dll和程序的依赖项复制到target/lib 当我尝试在Netbeans之外运行我的应用程序时,出现以下错误: Can't load this .dll (machine code=0xbd) on a AMD 64-bit

我有一个项目正在使用一些本机库.dll。我正在使用Netbeans,并且在运行配置中指定了java.library.path。从Netbeans运行项目不会产生错误

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

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

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命令使用的java版本可能与Netbeans不同,因此我尝试:

"C:\Program Files\Java\jdk1.8.0_77\bin\java.exe" -Djava.library.path=lib\ -jar abcontrol-1.0-SNAPSHOT.jar
但我还是犯了同样的错误

没有Netbeans我如何运行我的应用程序

编辑

从对这个问题的回答中,我补充道:

到我的代码中,尝试打印JVM体系结构。我从Netbeans和外部Netbeans运行应用程序,在这两种情况下,它都打印了64个

编辑2

运行java版本打印

编辑3

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

无法在AMD 64位平台上加载此.dll机器代码=0xbd

很明显,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—无法在IA 32位平台上加载此.DLL machine code=0xbd。 奇怪的是:这是在我将DLL移动到一个文件夹中之后发生的,该文件夹中包含了在构建过程中必须复制的其他资源

我花了很长时间才发现maven resources插件由于某种原因正在更改DLL文件,这可能是一个bug?。原始DLL文件为76 kb-目标文件夹中复制的DLL为118 kb。生成期间文件发生了一些问题


添加额外的执行以复制DLL文件而不使用true解决了问题。

当我尝试运行由Maven构建但使用32位DLL的JAR时,遇到了相同的问题-无法在IA 32位平台上加载此。DLL机器代码=0xbd。 奇怪的是:这是在我将DLL移动到一个文件夹中之后发生的,该文件夹中包含了在构建过程中必须复制的其他资源

我花了很长时间才发现maven resources插件由于某种原因正在更改DLL文件,这可能是一个bug?。原始DLL文件为76 kb-目标文件夹中复制的DLL为118 kb。生成期间文件发生了一些问题


添加额外的执行以复制DLL文件而不使用true解决了问题。

另一个替代解决方案是使用以下帖子中建议的方法: 这基本上是添加项目级配置,以便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>

另一个替代解决方案是使用以下帖子中的建议: 这基本上是添加项目级配置,以便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>

您使用的是32位还是64位JVM?JVM和本机库的位必须匹配。32位JVM无法加载64位DLL,反之亦然。我99%确定我使用的是64位JVM。但我怎样才能证实这一点呢?另外,我猜Netbeans使用相同的JVM?如果是这样的话,Netbeans如何在我不能的情况下使其工作?将dll位置作为参数发送或使用新文件mydllocation.exist检查;要在加载系统库之前进行验证,哦,糟糕,请忽略它,可以看到运行java的文件-如果是64位JVM,命令行上的版本应该是java HotSpotTM 64位服务器VM。您使用的是32位还是64位JVM?JVM和本机库的位必须匹配。32位JVM无法加载64位DLL,反之亦然。我99%确定我使用的是64位JVM。但我怎样才能证实这一点呢?另外,我猜Netbeans使用相同的JVM?如果是这样的话,Netbeans如何在我不能的情况下使其工作?将dll位置作为参数发送或使用新文件mydllocation.exist检查;在加载系统库之前进行验证哦,糟糕,请忽略它,可以看到命令行上运行java-version的文件,如果是64位JVM,应该说类似java HotSpotTM 64位服务器VM。这很好。多亏了你,我才节省了时间。非常好。多亏了你,我才节省了时间。
  <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>