当我做不到的时候,Maven正在做什么样的巫术呢?

时间:2016-07-08 06:55:42

标签: java maven netbeans dll

我有一个带有一些库依赖项(.dll)的maven项目(我把它放在“lib”文件夹中)。我可以在Netbeans中没有问题地运行项目,但是当我尝试在Netbeans之外运行构建的.jar时,我在加载库时遇到以下错误:

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

我的计算机上只安装了一个 Java实例,它应该与Netbeans / Maven用于运行项目的JVM相同。所以我无法理解Netbeans / Maven如何在与我不同的平台上运行此应用程序?我已经尝试查看Netbeans执行的命令(从输出中)来运行项目,我认为就是这样:

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\""

我尝试了这两个命令

"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

我添加System.out.println(System.getProperty("sun.arch.data.model"));以使我的应用程序打印出cpu架构。它会在两种情况下打印64

试着查看C:\Program Files\NetBeans 8.1\java\maven\bin\mvn.bat中的“mvn.bat”文件,但我找不到任何关于Maven正在做什么来运行我的应用程序的线索。

有人可以帮我这个吗?

修改

这是我的测试项目的完整源代码。我的项目是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>

我的项目班级

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输出(为详细输出添加了--debug选项):

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
------------------------------------------------------------------------

尝试运行我的内置.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:

对于任何想要重现此错误的人,可以找到jni4net here。我用这个windows批处理文件安装了.jar:

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:

我安装了32位JVM,并尝试使用以下命令运行应用程序:

"C:\Program Files (x86)\Java\jre1.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.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)

我在这里非常绝望(对Java有点沮丧)

EDIT4:

尝试了这些命令,但也无法正常工作:

"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

2 个答案:

答案 0 :(得分:9)

我很久以前就遇到过这个问题。

只需删除public class ErrorsController : Controller { public ActionResult General(Exception exception) { return Content("General failure", "text/plain"); } public ActionResult Http404() { return Content("Not found", "text/plain"); } public ActionResult Http403() { return Content("Forbidden", "text/plain"); } } ,这会在复制时损坏文件。 (Bug !! ???)。

我能够重现你的问题。这也将解决您的问题

希望这会有所帮助。

答案 1 :(得分:0)

显然,我的应用程序无法在编译期间复制.dll。为了使它工作,我必须加载原始库文件(而不是复制的文件)。 Netbeans正在这样做,因此我的应用程序从Netbeans运行良好,但在尝试使用已编译(和复制)的文件时却没有。

FIX :在我的UITableViewDataSource中,资源过滤设置为pom.xml。我将其设置为true(或删除条目),现在我的应用程序可以从外部netbeans启动。这是我的新false

pom.xml