Maven 构建缺少包链接
Maven build has missing package linkages
我在使用 Maven 时遇到问题。我有一个 Apache Flink 项目,想 运行 它在我的服务器上。在本地它 运行 没问题,但在服务器上它中止并出现错误:
java.lang.NoClassDefFoundError: org/apache/flink/examples/java/ml/util/LinearRegressionData
在我的 Java 项目中,我用
导入了 class
import org.apache.flink.examples.java.ml.util.LinearRegressionData;
我在导入时使用了正确的 class:
构建完成后,我查看了 Jar 文件。包括以下 classes:
/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
是父 pom
模块;不是 jar
模块。你如何构建你的jar文件?使用 maven-jar-plugin
?常规 mvn package
或 mvn 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
比较
您还需要 "pull" 并将您的依赖项解压缩到您的项目中,以便它们可以使用 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>
我在使用 Maven 时遇到问题。我有一个 Apache Flink 项目,想 运行 它在我的服务器上。在本地它 运行 没问题,但在服务器上它中止并出现错误:
java.lang.NoClassDefFoundError: org/apache/flink/examples/java/ml/util/LinearRegressionData
在我的 Java 项目中,我用
导入了 classimport org.apache.flink.examples.java.ml.util.LinearRegressionData;
我在导入时使用了正确的 class:
构建完成后,我查看了 Jar 文件。包括以下 classes:
/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
是父 pom
模块;不是 jar
模块。你如何构建你的jar文件?使用 maven-jar-plugin
?常规 mvn package
或 mvn 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
比较您还需要 "pull" 并将您的依赖项解压缩到您的项目中,以便它们可以使用 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>