jar包

作者: going_hlf | 来源:发表于2020-09-20 18:14 被阅读0次

    jar是java的发布形式,类似于windows的.dll,.exe文件和linux的.so,.a文件等。
    类比我们用C语言写程序,首先将每个.c编译成.o文件,然后在将所有的.o文件链接成一个库/可执行文件。java也有类似的过程,将.java文件编译成.class文件,然后将所有的.class文件组装成一个jar文件。(虽然本质是不一样的,但外表类似)。

    仍然接续上一个例子:

    // app/AppMain.java
    package app;
    import innerClass.InnerClass;
    
    public class AppMain {
        public static void main(String[] args) {
            new InnerClass().innerFunc();
        }
    }
    
    // innerClass/InnerClass.java
    package innerClass;
    public class InnerClass {
    
        public void innerFunc() {
            System.out.println("Hello World!");
        }
    }
    
    // appTest/InnerClassTest.java
    package appTest;
    import innerClass.InnerClass;
    // import junit.framework.TestCase;
    
    public class InnerClassTest extends TestCase {
        public static void main(String[] args) {
            testInnerClass();
        }
        public static void testInnerClass() {
            new InnerClass().innerFunc();
    //        assertEquals(0, 0); // 加了这个找不到junit
        }
    }
    

    1. 将app下的文件打包,做成一个可执行的jar包

    先通过javac将AppMain.java和InnerClass.java编译成.class文件。
    执行命令:jar -cvf app.jar app/App.class app/InnerClass.class或者jar -cvf app.jar app
    执行jar文件,此时必须指定main函数所在的类(主类)。java -classpath app.jar app.AppMain。这样每次指定classpath和主类都会比较麻烦。下面使用manifast配置文件来解决这个问题。

    2.加上manifast

    其实在执行jar命令打包jar文件的时候,已经默认生成了一个manifast,只不过它太简单,没什么用,通过解压工具对jar包进行解压后可以发现该文件内容如下:

    Manifest-Version: 1.0
    Created-By: 14.0.2 (Oracle Corporation)
    

    我们可以在打jar包的过程中,将主类信息写入到manifast文件,命令如下jar cvfe app.jar app.AppMain app,此时压缩出来的jar包执行时可以不再加主类。执行命令java -jar app.jar即可。再打开manifast文件,可以看到的内容中包含了主类信息:

    Manifest-Version: 1.0
    Created-By: 14.0.2 (Oracle Corporation)
    Main-Class: app.AppMain
    

    上面是自动生成的manifast文件,我们也可以自己写manifast文件然后打包到jar包中。例如我们自己的jar包文件内容如下:

    Manifest-Version: 1.0
    Created-By: my app
    Main-Class: app.AppMain 
    

    然后执行命令制作jar包jar -cvfm app.jar manifest app/AppMain.class app/InnerClass.class(注意manifest一定要在class文件前面)。效果跟自动生成的一样。

    3. 将app下的文件打包,然后供test目录下的文件调用。这也符合测试的原则,开发团队将自己的程序发布给测试团队进行黑盒测试。

    此时有两个主类,这一样的场景下,将业务代码生成一个jar包,另外的两个包来使用它。
    首先将InnerClass.class打到一个jar包中,命名为InnerClass.jar。命令jar -cvf InnerClass.jar app/InnerClass.class
    然后打包app.jar。将manifest文件的内容如下(文件最后的回车空行不能省,否则出错):

    Manifest-Version: 1.0
    Created-By: my app
    Main-Class: app.AppMain
    Class-Path: innerClass.jar
    
    

    最后将InnerClassTest.java也做成jar包,manifest内容如下:

    Manifest-Version: 1.0
    Created-By: my test
    Main-Class: appTest.InnerClassTest
    Class-Path: innerClass.jar
    
    
    Spring

    使用类似于Spring等框架,这些细节都省了。java最不缺的就是框架,让程序员傻瓜式地开发以提升效率,但是还是要稍微理解下背后的原理,以不断进行改进。

    相关文章

      网友评论

          本文标题:jar包

          本文链接:https://www.haomeiwen.com/subject/aihpyktx.html