我有一个maven项目,除了使用普通的repos之外还使用了一个本地jar。 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)
当我查看目标jar时,我也找不到这些类,尽管它们应该在lstnef-1.0.0.jar
内
对于解决这个谜团的任何建议我都会感激不尽。
答案 0 :(得分:7)
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提供给运行时环境。
或者,我会推荐这种方法,设置你自己的存储库,你可以添加JARS并以正常的maven方式管理它们
答案 1 :(得分:1)
使用系统范围告诉maven,在您提供的系统位置的maven“工作时间”内,依赖关系是可用的(这与使用正常依赖关系解析的提供范围不同)。 之后,您必须自己“提供”文件 - 例如将其放入CLASSPATH(因此与提供的范围相似)。要将文件安装到本地存储库缓存,您可以参考以下文章:
http://maven.apache.org/plugins/maven-install-plugin/examples/specific-local-repo.html
你可以省略localrepository路径,maven将安装在他的本地“缓存”中,它会在进入远程存储库之前查找任何依赖项。
当您使用Class-Path条目构建manifest.mf时,Maven也会支持您(例如,当您的应用程序在localhost上运行时):要查看它是如何工作的,请阅读here。
答案 2 :(得分: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>
答案 3 :(得分:0)
你需要使用shade插件 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>
答案 4 :(得分:0)
要将本地jar安装到本地存储库,请执行以下操作。
let jsonData = myJSONString.data(using: .utf8)