Maven不会向目标jar添加本地依赖项

时间:2013-10-04 11:37:28

标签: java maven

我有一个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

对于解决这个谜团的任何建议我都会感激不尽。

5 个答案:

答案 0 :(得分: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提供给运行时环境。

或者,我会推荐这种方法,设置你自己的存储库,你可以添加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)