2013-10-04 61 views
2

我有一个maven项目,除了使用正常的回购也使用本地jar。该罐在清单中定义是这样的:Maven不会添加本地依赖项到目标jar

<dependency> 
     <groupId>com.mirrorworlds</groupId> 
     <artifactId>lstnef</artifactId> 
     <version>1.0.0</version> 
     <optional>false</optional> 
     <scope>system</scope> 
     <systemPath>${basedir}/lib/lstnef-1.0.0.jar</systemPath> 
    </dependency> 

安装脚本的工作成功,但应用程序启动后,我得到这样的:

Exception in thread "main" java.lang.NoClassDefFoundError: 
com/mirrorworlds/lifestreams/mail/tnef/internet/TnefMultipart 
at ...processMails(MailProcessor.java:57) 
at ...main(MailReader.java:42) 

当我看到目标罐子里面我可以” t找到这些类,以及它们,但它们应该在里面lstnef-1.0.0.jar

我会感谢任何有关解决这个谜团的建议。

+2

使用本地存储库管理器和安装这个罐子把它比你可以使用它作为一个USAL依赖。让生活更轻松。 – khmarbaise

+0

@khmarbaise,我对maven完全陌生,并且得到了这个项目来介绍一些更新。它曾经以某种方式工作,但现在我无法让它们都恢复原状。 – svz

回答

1

我使用的可能的解决方案是在编译阶段之前将此系统JAR安装到本地Maven存储库中,然后将此JAR作为Maven工件引用。即

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-install-plugin</artifactId> 
    <version>2.2</version> 
    <executions> 
     <execution> 
      <id>your-file</id> 
      <inherited>false</inherited> 
      <phase>validate</phase> 
      <configuration> 
       <file>${pom.basedir}/lib/your-file-4.8.jar</file> 
       <repositoryLayout>default</repositoryLayout> 
       <groupId>your-file</groupId> 
       <artifactId>your-file</artifactId> 
       <version>4.8</version> 
       <packaging>jar</packaging> 
       <generatePom>true</generatePom> 
      </configuration> 
      <goals> 
       <goal>install-file</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

,然后引用它:

<dependency> 
    <groupId>your-file</groupId> 
    <artifactId>your-file</artifactId> 
    <version>4.8</version>  
</dependency> 
+0

将标志这一个,因为它提供了即插即用解决方案。 – svz

0

你需要使用遮阳插件 http://maven.apache.org/plugins/maven-shade-plugin/

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.1</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <transformers> 
       <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
        <manifestEntries> 
        <Main-Class>org.sonatype.haven.ExodusCli</Main-Class> 
        <Build-Number>123</Build-Number> 
        </manifestEntries> 
       </transformer> 
       </transformers> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 
+0

那么,我实际上并不需要将库作为一个罐子放在罐子里。如果它是解压缩的,对我来说也很好。 – svz

7

检查Maven文档:http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope

system 
This scope is similar to provided except that you have to provide the JAR which contains it explicitly. The artifact is always available and is not looked up in a repository. 

您需要手动提供JAR运行时环境自己。

或者,我会reccommend这种做法,建立自己的资源库,你可以在正常的行家方式

+0

你能否解释一下这个部分:'你必须提供明确包含它的JAR'?当目标jar被编译并且编译成功时,我确实在'$ {basedir}/lib/lstnef-1.0.0.jar'中提供了该jar。我也试图提供目标jar,但我一直得到这个异常。我在这里错过了什么? – svz

+0

您正在提供的JAR正在构建过程中使用。但是由于它的范围与“提供”相同,因此它不包含在最终版本中,所以它期望运行时提供它。 – cowls

+0

罐子的范围是*系统*,而不是*提供* – svz

1

使用系统范围中添加的jar和管理他们告诉Maven的依赖是行家期间可用“工作小时“在您提供的系统位置(这是与使用正常的依赖关系解析代替的提供的范围的区别)。 之后,您必须自己“提供”文件 - 例如将其放入CLASSPATH(因此与提供的范围相似)。要将文件安装到你的本地库高速缓存,你可以参考这篇文章:

http://maven.apache.org/plugins/maven-install-plugin/examples/specific-local-repo.html

你可以只ommit的localrepository路径和Maven将在他的本地“缓存”安装在那里才去查找任何相关性到远程存储库。

当您使用Class-Path条目创建manifest.mf时(例如,当您的应用程序在本地主机上运行时),Maven也将为您提供支持:要了解其工作原理,请参阅here

相关问题