【问题标题】:Maven : Using class from imported jarMaven:使用导入 jar 中的类
【发布时间】:2015-01-04 14:44:30
【问题描述】:

我是 Maven 的新手。
我正在尝试执行以下操作:
假设我们必须项目 A 和 B。项目 B 需要使用从 A 导入的 jar 中的一些 classfrom_A 以下是定义: 项目 A 的 POM.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>A_Group</groupId>
  <artifactId>A_Artifact</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>
  <name>A_Project</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
</project> 

这是项目 B 的 POM.xml(取决于 A):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>B_Group</groupId>
    <artifactId>B_Artifact</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    <name>B_Project</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>A_Group</groupId>
            <artifactId>A_Artifact</artifactId>
            <version>1.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

这是项目 B 的代码 sn-p:

import packageFromA.*;
public class App {
    public static void main(String[] args) {
    classFromA ca = new ClassFromA; //from packageFromA 
    ca.someFunction();            
    }
}

我为 A 运行 mvn install ,然后为 B 运行没有错误 但是当尝试从 IntelliJ Idea 运行上述代码时,出现错误: 错误:(3, 18) java: 包 packageFromA 不存在

据我从 Maven 文档中了解到:“编译依赖项在所有类路径中都可用,并且它们已打包”。但似乎导入类仍然没有解决。定义中缺少什么?在此先感谢

更新:从 IntelliJ 运行时,重新导入后问题已解决。但是当我从命令行运行时
java projectB
我需要明确设置导入 jar 的类路径吗?如果是,我是否需要指向我在本地 maven 存储库 (.m2/repository) 的位置?谢谢

【问题讨论】:

  • pom.xmls 似乎不错,这更有可能是 IDE 问题。你检查生成的jars 了吗?
  • 感谢您的回复。为项目 A 生成的 jar 包含 classFromA.class 文件。是否应该安装 A 更新类路径的 mvn ?
  • 但是项目 B 是否包含项目 A jar 文件?如果是这样,那么这是一个 IDE 问题。
  • 不,B 的 jar 不包含 A 的 jar。所以据我了解,这是导入问题,是否正确?应该在这里检查哪些设置?更多信息 - 两个项目都安装在同一个本地存储库中。谢谢
  • install 之后使用mvn package

标签: java maven


【解决方案1】:

在项目 B 的 POM 中,您可以为 maven-jar-plugin 添加配置以生成包含类路径的 MANIFEST 文件:

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.5</version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
            </manifest>
          </archive>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build> 

</project>

这将在您的 MANIFEST 文件中设置类路径属性,该属性要求所有依赖 jar 库位于主 jar 的子目录 lib/ 中。您需要将这些库手动复制到lib 目录中。

要使用 maven 将您的应用程序与所有依赖库一起分发,您可以使用 maven assembly plugin

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多