在昨天 晚上 遇到了用idea 打包自己的自定义函数成jar,怎么都不行,翻查了很多博客,发现CSDN上很多博客都存在问题,而且还搜到很多博客错的一样,但是博主名字 不一样的情况,差点把我心态搞崩。
这是当时遇到的问题,还有一个问题是 在hive里面根据这个jar包创建函数的时候,还会报 你自己写的主类找不到的问题。
经过很多测试,我自己终于解决了这个问题。
下面是我的解决办法,注:错误是千奇百怪的,也许我的解决办法并不能解决你的问题。
首先 这是我 自定义 函数 是使用了maven,下面是我的pom.xml 文件
<?xml version="1.0" encoding="UTF-8"?> <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>hive</groupId> <artifactId>hiveUdf</artifactId> <version>1.0-SNAPSHOT</version> <name>hiveUdf</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <hadoop.version>2.5.0</hadoop.version> <hive.version>0.13.1</hive.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- hadoop client --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> <!-- hive client --> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>${hive.version}</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>${hive.version}</version> </dependency> </dependencies> <build> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --> <plugin> <artifactId>maven-site-plugin</artifactId> <version>3.7.1</version> </plugin> <plugin> <artifactId>maven-project-info-reports-plugin</artifactId> <version>3.0.0</version> </plugin> </plugins> </pluginManagement> </build> </project>
然后,我们在main文件夹下,建一个resources 资源文件夹。你自己建的时候,这个文件夹肯定是空的。
然后我们按下图步骤点开
同样,我们按照以下步骤。
点击下图所示
注意,我们自定义的hive的函数 是没有 main方法的,我自己自定义的 hive函数是这样的
接着上面的步骤,没有main方法,这块红色区域,搜不到我们写的类
所以我们点击右边的选项卡。
在我们点击ok 的时候会报错。因为我们的自定义hive函数没有main方法,所以报错。但是是并不影响,这里报错是没关系的。
我们在点击下弹出的错误提示框的 ok,再点击取消。回到刚才的地方,发现 虽然报错,不过 还是把我们自定义的类加载进来了。
然后依次按我下图所示。
选择我们之前创建的resources 文件夹
此时我们就会发现,在resources 文件夹下 ,多了些东西。
然后,按下图
点击build,后就idea就开始自动为我们创建jar包了。
然后我们在out 文件夹下就能找到。
既然jar包 打好了,就能把它导入你的hive里面了。