当我不能运行这个项目时,Maven 正在做啥样的魔法?

Posted

技术标签:

【中文标题】当我不能运行这个项目时,Maven 正在做啥样的魔法?【英文标题】:What kind of sorcery is Maven doing to run this project, when I can't?当我不能运行这个项目时,Maven 正在做什么样的魔法? 【发布时间】:2016-11-10 16:00:11 【问题描述】:

我有一个带有一些库依赖项 (.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.clas-s-realm < 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 tbh 有点沮丧)

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

【问题讨论】:

做一个小例子,重现其他人可以看到的问题。 尝试使用 --debug 选项运行 Maven,这应该会为您提供有关 Maven 正在做什么的更多详细信息。 运行似乎没有找到 64 位的 dll,而是给出了 32 位的 dll,也许 NetBeans 在 32 位下运行它。 System.getProperties().list(System.out); 会显示该信息。选择“C:/Program Files (x86)/java/...”可能会有所帮助。 感谢您的关注,伙计们。有关 myproject 的完整源代码,请参阅我的问题更新,并运行输出。 在源代码中添加了System.getProperties().list(System.out);,以便在运行 Netbeans/Maven 和从命令行时进行比较。输出实际上是相同的。 【参考方案1】:

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

只需删除 &lt;filtering&gt;true&lt;/filtering&gt; ,这会在复制时损坏文件。 (漏洞 !!???)。

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

希望这会有所帮助。

【讨论】:

是的,这解决了错误。谢谢。到底什么是“过滤”,为什么要破坏 .dll? 过滤允许您为资源使用变量。他解释了maven.apache.org/plugins/maven-resources-plugin/examples/… 更具体地说,资源过滤尝试对插件处理的资源执行变量替换。即它在资源中查找并替换看起来像 "$some.name" 的东西。如果您对非文本资源执行此操作,则可能会损坏它。这不是一个错误……它是一个特性。【参考方案2】:

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

FIX:在我的pom.xml 中,资源过滤设置为true。我将它设置为false(或删除条目),现在我的应用程序可以从外部netbeans 启动。这是我的新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>false</filtering>
                                </resource>
                            </resources>
                        </configuration>            
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

【讨论】:

那么正确的方法应该是排除jni而不是关闭过滤。过滤是一种用来自 pom / maven 的值“替换”资源文件中的“变量”的方法。对多重配置很有用。我怀疑库文件中存在格式可变的文本,$likethis 我明白了。所以它正在用值替换公认的变量名?我认为我不会在lib 文件夹中放入任何适合此功能的内容。但我可以看到在其他情况下(资源文件夹)启用过滤和排除 .dll 会更好。

以上是关于当我不能运行这个项目时,Maven 正在做啥样的魔法?的主要内容,如果未能解决你的问题,请参考以下文章

运行eclipse需要啥样的配置? 一定要上固态硬盘吗?

我可以为这个大型 excel 文件数据集运行啥样的分析?

这个 wcf 服务正在运行……那是啥样的绑定?哪个是默认绑定?有人解释吗?

./configure 的啥样的输出被认为是坏的?

当我在 java 中使用 connection.setAutoCommit(false) 时,在 MySQL 上设置了啥样的锁?

CopyOnWrite的应用场景是啥样的?