今天折腾了一天 研究 idea 打可运行scala 代码的 jar 包。有些心得记录下来,供大家参考,希望能帮助到一些同事。
此前在网络上有一些关于打jar 包的资料,大都是一些转载,或者介绍的不是很详细。此篇是详细介绍打包过程以及思考推导方式,供大家参考。
此文章分为 1 IDEA 打可执行jar 包
2 idea maven 打可执行jar 包
两个部分介绍
IDEA 打可执行 jar 包
先创建scala project FILE-->new --> project -->scala
然后输入自己的项目名称 创建OBJECT MAIN
注意: 要先配置 jdk 环境和 scala 环境 否则程序会报错,本篇文章不过度引申此细节。
然后开始配置打包 File--->project structure --> Artifacts 然后点击 "+"
待出现弹窗后写入自己配置的主类 如图:
写入自己配的含有 main object 点击OK 然后 会显示如下界面
如上图:黑色框代表你jar 的生成路径 , 红色框代表已经加入到打包里面的信息,绿色框代表你自此打包的被调用的主函数类,紫色框是IDEA认为你有可能需要添加入jar 中的其他类库。
一切信息就绪点击OK
然后观察左侧 IDEA 会自动刷新变化 在src 目录下 idea 自动生成了 META_INF 这个文件夹 如图:
此处生成的MANIFEST.MF 是非常有用的为文件,先买一个官司,待会再讲这个文件。
一切就绪开始生成 可执行文件!
BUILD---->BUILD Artifact ----> BUILD
如图:
在生成路径下寻找你生成的jar 包 如图:
然后用 java -jar 命令运行它
返回结果如图:
恭喜你! 你已经可以成功运行 scala 可执行jar 文件了!!
但是可以以此方法运行 maven 的 jar 吗?
开始配置maven 工程 添加maven 依赖
点击项目 ----右键 --->Add FrameWorkSupport -->maven 勾选
选择完之后系统会自动生成POM.xml文件 如图:
注意:此处为了演示方便排除其他干扰所以 pom里面没有设置任何依赖,只是初始pom.xml
然后打开maven 视图 view-->Tool Windows-->Maven Projects
如图:
此视图列举了 maven生命周期,以及各种插件,plugins下面的可以按照用户需求自行添加。
然后配置maven 本地依赖库 settings ---> 搜索maven
然后再次 执行上述步骤 打包 注意此处 再次打包需要删除 原来的 META -INF 文件夹,否则IDEA不会按照新maven工程方式打包!!
删除文件再次打包,然后调用java -jar 你的包名 .jar
发现如下错误,如图:
思考:仅仅引入maven 以同样方式打包却会出现找不到main 函数,貌似jar包里面没有指定main 函数入口。但是没有改任何配置啊?明明主类已经指定?
看来maven工程的打包方式不应该用idea 原生方式打包。
查看jar 文件里信息。我们会发现
解释: 红色框为记录关于jar 包的一些基本信息,绿色框 scala 是scala 程序依赖, 黑色框 testscalajar3 你写的程序包,紫色框 一些配置文件。
进入 META-INF 发现里面有一个 MANIFEST.MF 的配置文件. 打开它
貌似记录了一大堆有的没的 ,没啥价值,不死心,再看看之前运行成功的jar MANIFEST.MF 信息 内容很简单只有两行代码
如图:
这个MaNIFEST.MF和前者只有 这个区别 在前者的 MaNiFEST.MF 里面没有找到 Main-Class 标示
尝试 :把此行拷贝到 之前的 jar 对应文件中如图:
然后放入jar 包。接着执行 java -jar 指令 程序正常运行!!!
但是此种方法 每次打jar 包都要频繁操作 太过于麻烦.所以采用第二种方式 idea Maven 打jar 包方式
Maven 打可执行Jar 包。网上介绍的可以参考借鉴随便拿来一种配置在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.0modelVersion> <groupId>groupIdgroupId> <artifactId>testScalaJarartifactId> <version>1.0-SNAPSHOTversion> <packaging>jarpackaging> <dependencies> dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.pluginsgroupId> <artifactId>maven-assembly-pluginartifactId> <version>2.5.5version> <configuration> <archive> <manifest> <mainClass>com.testscalajar.StreamingTestmainClass> manifest> archive> <descriptorRefs> <descriptorRef>jar-with-dependenciesdescriptorRef> descriptorRefs> configuration> <executions> <execution> <id>make-assemblyid> <phase>packagephase> <goals> <goal>singlegoal> goals> execution> executions> plugin> plugins> build> project>
在右侧的IDEA会出现依赖显示
貌似一切就绪 直接点击 lifcycle --->package 生成 jar 文件
注意:此种生成方式 需要你提前删除 目标文件夹下面文件,否则会报错 。
删除该文件夹下面所有 文件 再点击 package 观看IDEA 控制台 打包成功
在target 文件夹下面生成了 testScalaJar-1.0-SNAPSHOT-jar-with-dependencies.jar 文件
然后打开 看看有没有主函数
有! 看来可以安心执行了 。执行 java -jar
出现如下问题:
为什么 还会报这种问题?但是貌似问题和 没有主程序清单 错误有所不同,在观察jar 包。
竟然发现 没有自己的 com.testscalajar.streamingTest.class 而只有 testJava.class ... 也就是说只有 .java的文件被编译了,而 .scala的文件没有被编译!!
结论: maven 默认只编译java 的文件,而不会编译scala 文件。但是maven 提供了 能够编译scala 的类库。因此再次改造POM.xml
加入如下 plugin 此插件是Maven 用来编译 scala 的插件
<plugin>
<groupId>org.scala-toolsgroupId>
<artifactId>maven-scala-pluginartifactId>
<version>2.15.2version>
<executions>
<execution>
<goals>
<goal>compilegoal>
<goal>testCompilegoal>
goals>
execution>
executions>
plugin>
然后删除target 下所有文件再次点击package 进行打包
再次执行 java -jar 命令 程序 正常执行!!
总结:两种方式都可以实现 打maven 运行包.但后者更加便捷,而且maven 提供了丰富的plugin插件,以及优雅的打包,编译等方式(只需点击,而不用像eclipse那样输入maven指令)