2

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

对于解决这个谜团的任何建议,我将不胜感激。

4

5 回答 5

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 方式管理它们

于 2013-10-04T11:40:06.163 回答
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 上运行时):要了解它是如何工作的,请阅读此处

于 2013-10-04T12:04:49.317 回答
1

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

<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>
于 2013-10-04T12:49:11.440 回答
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>
于 2013-10-04T11:39:10.600 回答
0

要将本地 jar 安装到本地存储库,请执行以下操作。

mvn install:install-file -Dfile=lib/ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.4 -Dpackaging=jar
于 2020-03-10T18:42:27.777 回答