java - Maven 构建缺少包链接

标签 java maven intellij-idea apache-flink

我在使用 Maven 时遇到问题。我有一个 Apache Flink 项目,想在我的服务器上运行它。在本地它运行良好,但在服务器上它因错误而中止:

java.lang.NoClassDefFoundError: org/apache/flink/examples/java/ml/util/LinearRegressionData

在我的 Java 项目中,我导入了类

import org.apache.flink.examples.java.ml.util.LinearRegressionData;

我在导入时使用了正确的类:

enter image description here

构建完成后,我查看了 Jar 文件。包括以下类(class):

enter image description here

/util/文件夹完全丢失。我在 pom 文件中的依赖部分如下所示:

<dependencies>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-core</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-table</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-runtime</artifactId>
        <version>0.9.0</version>
    </dependency>
</dependencies>

当我在位于 https://github.com/apache/flink/tree/release-0.9 的存储库中看到包组织时,我认为可以将以下行添加到 flink 中:

    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-examples</artifactId>
        <version>0.9.0</version>
    </dependency>

但是无法解决这些依赖关系。由于 Maven 在执行全新安装时不会抛出错误,我认为这是一个依赖性问题。我以为 Maven 会自动包含所有使用过的导入。我怎样才能让它在我的服务器上运行?

最佳答案

您应该包括 ML 示例,如下所示:

 <dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-java-examples</artifactId>
    <version>0.9.0</version>
</dependency>

flink-examples是 parent pom模块;不是jar模块。你如何构建你的jar文件?使用 maven-jar-plugin ?一个普通的mvn packagemvn install不打包依赖。

使用 maven-jar-plugin需要使用 <include> 指定您需要包含的内容.看这里:https://maven.apache.org/plugins/maven-jar-plugin/examples/include-exclude.html

在你的情况下它应该是这样的:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifestEntries>
                <Main-Class>org.apache.flink.examples.java.ml.LinearRegression</Main-Class>
            </manifestEntries>
        </archive>

        <includes>
                <include>org/apache/flink/examples/java/ml/*.class</include>
                <include>org/apache/flink/examples/java/ml/util/*.class</include>
        </includes>
    </configuration>
</plugin>

您还可以与https://github.com/apache/flink/blob/master/flink-examples/flink-java-examples/pom.xml 进行比较

您还需要“拉”并将您的依赖项解压缩到您的项目中,以便可以使用 maven-dependency-plugin 重新打包它们

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.9</version><!--$NO-MVN-MAN-VER$-->
    <executions>
        <execution>
            <id>unpack</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>org.apache.flink</groupId>
                        <artifactId>flink-java-examples</artifactId>
                        <version>0.9.0</version>
                        <type>jar</type>
                        <overWrite>false</overWrite>
                        <outputDirectory>${project.build.directory}/classes</outputDirectory>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

关于java - Maven 构建缺少包链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31661900/

相关文章:

java - 使用 JUnit 处理 EDT/非 EDT 问题的最佳方法是什么?

java - 将位置与数组中的上一个/下一个位置进行比较

java - ImageView MotionEvent如果有两个指针,则停止ACTION_UP

java - 如何安装maven构建项目?

java - 如何使用 IntelliJ IDEA 删除 javadoc

javascript - IntelliJ 14 使用 JS 和 CSS 查找用法/重构

java - Hibernate 中用于自动递增 MySQL 主键的 Java 注释是什么 - @Id

java - 前端 Maven 插件不能 "bower install"

java - Dockerfile maven 与 ARG

java - 如何将外部库 (libs) 集成到 grails 项目中?