2012-11-13 42 views
7

我有一个依赖Maven的:添加本地依赖于罐子

<dependency> 
     <groupId>de.matthiasmann</groupId> 
     <artifactId>twl</artifactId> 
     <version>1.0.0</version> 
     <scope>system</scope> 
     <systemPath>${project.basedir}/lib/TWL.jar</systemPath> 
    </dependency> 

然后我执行mvn assembly:assembly。所有的本地文件和远程maven库被添加,但没有这个jar。

UPDATE

当我试图通过java -jar myjar.jar运行的应用程序。它返回一个错误,即没有上述依赖项的类(NoClassDefFoundError:de.matthiasmann.twl.ForExample)。 我想从这个jar中添加类到myjar.jar(maven与远程依赖关系相同)。我如何配置maven来做到这一点?

+0

请详细 –

+0

看从@BlessedGeek的答案,也对这个相关的SO问题的博客:http://stackoverflow.com/questions/2229757/maven-add-a-dependency-to-jar -by-relative-path/2230464#2230464 – maba

+0

请参阅https://stackoverflow.com/a/45120371/1709793 – craftsmannadeem

回答

7

除非您的Java EE服务器/容器配置了该jar,否则不能使用systemPath。

请记住,maven只是开发和编译时间。一旦构建了war文件,除了将所有需要的jar文件放入WEB-INF/lib文件夹之外,maven没有任何作用。

当您指定系统范围时,这意味着您有责任在部署战争时确保该jar存在。你已经有了一个框架来做到这一点,你不希望用这个jar来阻碍你的构建依赖,但是你只能在开发过程中使它可用于Maven。

其他类似的范围是“提供”。例如JBoss或您的企业常见部署Tomcat框架已经提供了很多像Spring和Hibernate这样的jar,它们是由服务器启动加载的,并且是服务器中所有应用程序共有的。因此,你不希望Maven构建将其包含到war文件中。

正确的方式,Maven大师会告诉你。就是拥有你自己的Maven服务器,并在你的服务器上构建你需要的任何工件。然而,偶尔这是不可能的。

因此,在这种情况下,我创建了与项目一起分发并签入版本控制的项目级存储库。我运行命令mvn install来创建一个名为“project-repo”的项目级目录。

http://maven.apache.org/plugins/maven-install-plugin/examples/specific-local-repo.html(由于熟悉,大多数时候,我手动构建回购站而不是运行mvn install)。

然后在POM中,我指定file:// $ {project.basedir}/project-repo作为其中一个存储库。需要注意的是,在Windows中,“file://”之后的斜杠不是在引用Windows文件系统路径时必须反斜杠。

<repositories> 
    <repository> 
     <id>my-repo1</id> 
     <name>my custom repo</name> 
     <url>http://ho.ho.ho</url> 
    </repository> 
    <repository> 
     <id>project-repo</id> 
     <name>my project repo</name> 
     <url>file://${project.basedir}\project-repo</url> 
    </repository> 
    </repositories> 
+1

使用正斜杠没有问题' /'在windows上的文件url中。这很好。 +1顺便说一句。 – maba

0

如果你有这样的相关性最好的解决办法是先用一个repository manager和简单地把这种依赖到仓库管理员,后来用它作为简单的依赖。