2011-04-08 101 views
14

我想通过本地文件系统相对于我的项目目录结构而不是远程存储库通过systemPath添加jar文件。我添加了依赖声明,但maven并没有做任何其他的事情。Maven通过systemPath/system添加jar,但未添加到war或其他任何地方

在下面的声明中,我想将jar文件复制到我的目标web-inf/lib目录中,并将其作为war文件的一部分进行震动。目前,这并未发生。我如何将jar文件复制到我的war文件中?

这是从调试模式行家输出:

DEBUG] cglib:cglib-nodep:jar:2.2:test (setting scope to: compile)^M 
DEBUG] Retrieving parent-POM: org.objenesis:objenesis-parent:pom:1.2 for project: null:objenesis:ja 
DEBUG] org.objenesis:objenesis:jar:1.2:test (selected for test)^M 
DEBUG] org.javap.web:testRunWrapper:jar:1.0.0:system (selected for system)^M 
DEBUG] Plugin dependencies for: 
... 


<dependency> 
    <groupId>org.javap.web</groupId> 
    <artifactId>testRunWrapper</artifactId> 
    <version>1.0</version> 
    <scope>system</scope> 
    <systemPath>${basedir}/lib/testRunWrapper.jar</systemPath> 
</dependency> 
<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <configuration>     
     <webResources> 
      <resource> 
       <directory>WebContent</directory> 
      </resource> 
     </webResources> 
    </configuration> 
</plugin> 

回答

21

好的,我这样做:请注意底部的目录结构。 使用下面的方法,来自相关项目路径的jar文件被视为像其他jar一样的头等公民。下面的清单纠正了我原来的问题。通过下面的pom.xml清单,jar文件被复制到我的目标目录中。

<repositories> 
    <repository> 
     <id>JBoss</id> 
     <name>JBoss Repository</name> 
     <layout>default</layout> 
     <url>http://repository.jboss.org/maven2</url> 
    </repository> 

    <repository> 
     <id>my-local-repo</id> 
     <url>file://${basedir}/lib/repo</url> 
    </repository> 
</repositories> 

<dependency> 
    <groupId>testRunWrapper</groupId> 
    <artifactId>testRunWrapper</artifactId> 
    <version>1.0.0</version>    
</dependency> 

$ find repo 
repo 
repo/testRunWrapper 
repo/testRunWrapper/testRunWrapper 
repo/testRunWrapper/testRunWrapper/1.0.0 
repo/testRunWrapper/testRunWrapper/1.0.0/testRunWrapper-1.0.0.jar 
+1

这是什么问题? ?注意,你通常使用'mvn install:install-file'来安装一个依赖项,并且你的默认本地仓库位于'home/.m2/repository'。 – Thomas 2011-04-08 15:30:04

+0

不起作用... – nnhthuan 2012-07-18 10:01:27

+0

这是去捆绑ojdbc6驱动程序记得在应用到Windows设备时将本地系统路径分隔符更改为反斜杠 – 2012-07-25 14:58:59

1

AFAIK,系统范围的依赖性是有点像那些与设置范围,因此不包括在目标工件。为什么不将依赖项安装到本地存储库中呢?

从DOC:

系统
此范围类似,但你必须提供包含它明确的JAR提供。工件始终可用,并且不会在存储库中查找。

+0

我想我可以,但不知道这是否是要走的路。 – 2011-04-08 15:23:33

+2

“只需”将jar安装在本地存储库中。每次有新员工时,团队中的所有人。这是传统和第三方罐子的典型maven解决方案,但它很糟糕。将这些难以获取的罐子放在源代码控制中,然后建立“正常工作”的构建过程会容易得多,即使项目源中的罐子在maven-land中是亵渎的。至少,我宁愿将nexus服务器作为maven中央和本地构建工件的缓存,而不是作为稀少的自定义存档:-( – Roboprog 2015-06-17 23:53:10

+0

或者对这些项目具有单独的repo _within_ Nexus/Artifactory,称为“存档或者类似的,所以不会有任何混淆,那么你就不必向你的Maven人解释你为什么一天亵渎9次...... – SusanW 2017-04-26 11:48:59

5

不要使用系统。要做你想做的事情,只需声明一个常规(编译)依赖项,然后使用mvn install:install-file到你的本地仓库。其他一切都会按照你的意愿工作(lib将被复制等)。这意味着构建只能在你的机器上运行。

要正确地为您的(内部)团队解决此问题,您需要设置存储库(例如Artifactory,Nexus或Archiva)。这对团队使用Maven来说几乎是必须的。

如果这是公开的(例如开源)使用,您可以通过http服务器模仿存储库或建立一个真实的存储库。

+0

作为除此之外,CloudBees.com甚至可以提供一个不错的Maven仓库功能eir最便宜的账户选项。 – 2013-03-29 20:30:02

1

尝试这样的事情(使用Ant插件手动将罐子输出目录):

<plugin> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <executions> 
     <execution> 
      <phase>test</phase> 
      <goals> 
      <goal>run</goal> 
      </goals> 
      <configuration> 
      <tasks> 
       <copy file="${project.basedir}/pathToJAR.jar" 
        todir="${project.build.directory}/outputFileName/WEB-INF/lib"/> 
      </tasks> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
0

采用基准文件系统的问题是,相关项目将无法全局访问这个jar文件。即依赖项目的$ {basedir}是不同的,因此.jar文件将不会被找到。

另一方面,全球存储库是普遍可访问的。

14

使用Maven的依赖插件做这项工作:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.8</version> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>compile</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory> 
         <includeScope>system</includeScope> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
+0

仅供参考:当我这样做时,日志消息表明在* .war由松散文件创建后,该jar被复制到.../WEB-INF/lib/*中。这只会让瓶子进入战争,如果你运行它两次而不干净。 – Roboprog 2015-06-18 00:07:25

+1

我在你的设置中更改了一个单词:“包” - >“编译”执行阶段。现在它是第一次/在“清洁”之后。谢谢!!! – Roboprog 2015-06-18 00:13:45

0

如果this answer没有为你工作,因为它没有为我和你知道system是一个糟糕的范围,你可以试试这个解决方案,你在哪里(向下滚动一下),它将JAR安装到实际的本地Maven仓库中。基本上你只需要这个插件添加到您的pom.xml:在适当的值

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-install-plugin</artifactId> 
    <version>2.4</version> 
    <executions> 
    <execution> 
     <phase>initialize</phase> 
     <goals> 
     <goal>install-file</goal> 
     </goals> 
     <configuration> 
     <groupId>myGroupId</groupId> 
     <artifactId>myArtifactId</artifactId> 
     <version>myVersion</version> 
     <packaging>jar</packaging> 
     <file>${basedir}/lib/xxx.jar</file> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

填补groupIdartifactIdversion,并把原来的jar文件到<project-home>/lib -directory及以上的固定file。您可以添加更多execution -sections,但这时别忘了添加id在那儿,像:

 <execution> 
     <id>common-lib</id> 

大家谁从更新的代码回购需要调用mvn initialize一次。

和所有Eclipse的爱好者可能会增加这pom.xml,也摆脱错误在Eclipse:

<pluginManagement> 
    <plugins> 
    <!-- This plugin's configuration is used to store Eclipse m2e settings 
     only. It has no influence on the Maven build itself. --> 
    <plugin> 
     <groupId>org.eclipse.m2e</groupId> 
     <artifactId>lifecycle-mapping</artifactId> 
     <version>1.0.0</version> 
     <configuration> 
     <lifecycleMappingMetadata> 
      <pluginExecutions> 
      <pluginExecution> 
       <pluginExecutionFilter> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-install-plugin</artifactId> 
       <versionRange>[2.4,)</versionRange> 
       <goals> 
        <goal>install-file</goal> 
       </goals> 
       </pluginExecutionFilter> 
       <action> 
       <execute></execute> 
       </action> 
      </pluginExecution> 
      </pluginExecutions> 
     </lifecycleMappingMetadata> 
     </configuration> 
    </plugin> 
    </plugins> 
</pluginManagement>