记录在实际开发中开发遇到的问题
maven 的flink项目,在pom文件里面的配置如下:
<plugin>-->
<!-- <artifactId>maven-assembly-plugin</artifactId>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <version>2.6</version>-->
<!-- <configuration>-->
<!-- <classifier>exec</classifier>-->
<!-- <archive>-->
<!-- <manifest>-->
<!-- <mainClass>com.table.FlinkConnectHive</mainClass>-->
<!-- </manifest>-->
<!-- </archive>-->
<!-- <descriptorRefs>-->
<!-- <descriptorRef>jar-with-dependencies</descriptorRef>-->
<!-- </descriptorRefs>-->
<!-- </configuration>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <id>make-assembly</id>-->
<!-- <phase>package</phase>-->
<!-- <goals>-->
<!-- <goal>single</goal>-->
<!-- </goals>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->
基于上面的配置,在执行了maven package操作 之后,执行java -jar 报错
找不到主类或属性
解决方案
方案1
首先判断是maven的pom文件配置有问题。修改pom文件如下:
<plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-jar-plugin</artifactId>-->
<!-- <version>3.0.2</version>-->
<!-- <configuration>-->
<!-- <archive>-->
<!-- <manifest>-->
<!-- <addClasspath>true</addClasspath>-->
<!-- <mainClass>com.table.FlinkConnectHive</mainClass> <!– 此处为主入口–>-->
<!-- </manifest>-->
<!-- </archive>-->
<!-- </configuration>-->
<!-- </plugin>-->
执行maven complie,maven package之后,执行java -jar xxx.jar包。发现还是报同样的错误。
方案2
利用idea 里面的build来打jar包:
点击build之后会在当前项目的根目录下面产生out目录。
在执行java -jar 操作之后还是报错找不到程序主类或者属性。很奇怪,执行操作的打包按这种方式是没有问题的。今天见鬼了。无语。继续找其他方案。
方案3
继续修改maven的配置参数:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.table.FlinkToConnectHive</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
在进过compie, maven package之后,在执行java -jar发现成功了,就很疑惑。上网查资料发现问题
这篇文章有说明:
https://blog.csdn.net/calm_encode/article/details/103931537/
在maven打包配置里面有三种方式:
- maven-jar-plugin
可执行jar包与依赖包是分开的,需要建立lib目录来存放所需的依赖包,且jar包与lib目录在同级别目录中
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.xxx.xxxService</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
- maven-assembly-plugin
该插件会将所有的依赖包放入可执行jar包,但是该插件会缺失spring的xds文件,导致jar包无法运行,而且当同级别目录下还有其他可执行文件依赖可能会产生冲突
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.xxx.xxxService</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
- maven-shade-plugin
该插件将所有的依赖包放入可执行的jar包中,当同级别目录中有其他的可执行jar包时,依赖可能会产生冲突,且运行jar包时,有时候会出现类似SF,DSA,RSA文件冲突的提示,选哟派相互META-INF目录下的文件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.tooling</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.xxx.xxxInvoke</mainClass>
</transformer>
</transformers>
<minimizeJar>true</minimizeJar>
<shadedArtifactAttached>true</shadedArtifactAttached>
</configuration>
</execution>
</executions>
</plugin>
希望对于遇到类似的问题的小伙伴 有帮助,记得点一下赞!!!