intellij idea 打可运行scala jar 包的两种方式

今天折腾了一天 研究 idea 打可运行scala 代码的 jar 包。有些心得记录下来,供大家参考,希望能帮助到一些同事。

此前在网络上有一些关于打jar 包的资料,大都是一些转载,或者介绍的不是很详细。此篇是详细介绍打包过程以及思考推导方式,供大家参考。

此文章分为 1 IDEA 打可执行jar 包 

                    2 idea maven 打可执行jar 包 

两个部分介绍


IDEA 打可执行 jar 包

先创建scala project FILE-->new --> project -->scala 

              intellij idea 打可运行scala jar 包的两种方式_第1张图片


然后输入自己的项目名称 创建OBJECT MAIN

intellij idea 打可运行scala jar 包的两种方式_第2张图片




注意: 要先配置 jdk 环境和 scala 环境 否则程序会报错,本篇文章不过度引申此细节。

然后开始配置打包 File--->project structure --> Artifacts 然后点击 "+"

待出现弹窗后写入自己配置的主类 如图:

intellij idea 打可运行scala jar 包的两种方式_第3张图片

写入自己配的含有 main object  点击OK 然后 会显示如下界面

intellij idea 打可运行scala jar 包的两种方式_第4张图片

如上图:黑色框代表你jar 的生成路径 , 红色框代表已经加入到打包里面的信息,绿色框代表你自此打包的被调用的主函数类,紫色框是IDEA认为你有可能需要添加入jar 中的其他类库。

一切信息就绪点击OK 

然后观察左侧 IDEA 会自动刷新变化 在src 目录下 idea 自动生成了 META_INF 这个文件夹 如图:

intellij idea 打可运行scala jar 包的两种方式_第5张图片

此处生成的MANIFEST.MF 是非常有用的为文件,先买一个官司,待会再讲这个文件。

一切就绪开始生成 可执行文件!

BUILD---->BUILD Artifact ----> BUILD

如图:

intellij idea 打可运行scala jar 包的两种方式_第6张图片

在生成路径下寻找你生成的jar 包 如图:

intellij idea 打可运行scala jar 包的两种方式_第7张图片


然后用 java -jar 命令运行它 

返回结果如图:

intellij idea 打可运行scala jar 包的两种方式_第8张图片

恭喜你! 你已经可以成功运行 scala 可执行jar 文件了!!

但是可以以此方法运行 maven 的 jar 吗?

开始配置maven 工程 添加maven 依赖

点击项目 ----右键 --->Add FrameWorkSupport -->maven 勾选

intellij idea 打可运行scala jar 包的两种方式_第9张图片

intellij idea 打可运行scala jar 包的两种方式_第10张图片

选择完之后系统会自动生成POM.xml文件 如图:

intellij idea 打可运行scala jar 包的两种方式_第11张图片

注意:此处为了演示方便排除其他干扰所以 pom里面没有设置任何依赖,只是初始pom.xml

然后打开maven 视图 view-->Tool Windows-->Maven Projects 

如图:

intellij idea 打可运行scala jar 包的两种方式_第12张图片

此视图列举了 maven生命周期,以及各种插件,plugins下面的可以按照用户需求自行添加。

然后配置maven 本地依赖库 settings ---> 搜索maven


intellij idea 打可运行scala jar 包的两种方式_第13张图片

然后再次 执行上述步骤 打包 注意此处 再次打包需要删除 原来的 META -INF 文件夹,否则IDEA不会按照新maven工程方式打包!!

intellij idea 打可运行scala jar 包的两种方式_第14张图片

intellij idea 打可运行scala jar 包的两种方式_第15张图片


删除文件再次打包,然后调用java -jar  你的包名 .jar 

发现如下错误,如图:

intellij idea 打可运行scala jar 包的两种方式_第16张图片


思考:仅仅引入maven 以同样方式打包却会出现找不到main 函数,貌似jar包里面没有指定main 函数入口。但是没有改任何配置啊?明明主类已经指定?

看来maven工程的打包方式不应该用idea 原生方式打包。

查看jar 文件里信息。我们会发现

intellij idea 打可运行scala jar 包的两种方式_第17张图片

解释: 红色框为记录关于jar 包的一些基本信息,绿色框 scala 是scala 程序依赖, 黑色框 testscalajar3 你写的程序包,紫色框 一些配置文件。

进入 META-INF 发现里面有一个 MANIFEST.MF 的配置文件. 打开它

貌似记录了一大堆有的没的 ,没啥价值,不死心,再看看之前运行成功的jar  MANIFEST.MF 信息 内容很简单只有两行代码

如图:

intellij idea 打可运行scala jar 包的两种方式_第18张图片

这个MaNIFEST.MF和前者只有 这个区别 在前者的 MaNiFEST.MF 里面没有找到 Main-Class 标示 

尝试 :把此行拷贝到 之前的 jar 对应文件中如图:

intellij idea 打可运行scala jar 包的两种方式_第19张图片


然后放入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 控制台 打包成功

intellij idea 打可运行scala jar 包的两种方式_第20张图片

在target 文件夹下面生成了  testScalaJar-1.0-SNAPSHOT-jar-with-dependencies.jar 文件 

然后打开 看看有没有主函数 

intellij idea 打可运行scala jar 包的两种方式_第21张图片

有! 看来可以安心执行了 。执行 java -jar 

出现如下问题:

intellij idea 打可运行scala jar 包的两种方式_第22张图片

为什么 还会报这种问题?但是貌似问题和 没有主程序清单 错误有所不同,在观察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指令)
 
  

你可能感兴趣的:(intellij idea 打可运行scala jar 包的两种方式)