zoukankan      html  css  js  c++  java
  • java打包小记

    1.一个类的

    Hello.java

    class Hello{
         public static void main(String[] agrs){
             System.out.println("hello");
         }
    }

    生成class  javac Hello.java 

    打包 jar -cvf hello.jar Hello.class  

    说明:

      c表示要创建一个新的jar包

      v表示创建的过程中在控制台输出创建过程的一些信息

      f表示给生成的jar包命名

    运行 java -jar hello.jar

    提示 hello.jar中没有主清单属性

    用压缩软件打开hello.jar,META-INF文件夹,里MENIFEST.MF,用记事本打开,添加Main-Class属性

    修改为

    Manifest-Version: 1.0
    Created-By: 1.8.0_151 (Oracle Corporation)
    Main-Class: Hello

    保存后运行java -jar hello.jar

    输出Hello

    2.两个类的

    (1)简单的

    World.java

    class World{
         public static String say(){
             return "world";
         }
     }

    Hello.java

    class Hello{
         public static void main(String[] agrs){
             System.out.println("hello "+World.say());
         }
     }

    都编译成class

    手动添加META-INF/MANIFEST.MF

    Manifest-Version: 1.0
    Created-By: 1.8.0_151 (Oracle Corporation)
    Main-Class: Hello

    打包  jar -cvfm hello.jar META-INFMANIFEST.MF Hello.class World.class

    运行 java -jar hello.jar

    输出 hello world

      (2)带包名的打包

    com/World.java

    package com;
    public class World{
         public static String say(){
             return "world";
         }
     }

    编译为class

    Hello.java

    import com.World;
    class Hello{
         public static void main(String[] agrs){
             System.out.println("hello "+World.say());
         }
     }

    编译为class

    运行 java Hello

    输出 Hello World

    打包 jar -cvfm hello.jar META-INFMENIFEST.MF Hello.class com

    运行java -jar hello.jar

    输出 Hello World

    但是hello.jar包里的com下包含World.class和World.java

    优化:

      新建target目录

      javac com/World.java -d target

      javac Hello.java -d target

      复制目录加文件 META-INF/MANIFEST.MF

      jar -cvfm hello.jar META-INFMANIFEST.MF *

    3.带jar的打包

      (1)world.jar

      com/World.java

    package com;
    public class World{
         public static String say(){
             return "world";
         }
     }

      新建world目录

      javac com/world.java -d world

      在world下添加目录和文件  META-INF/MANIFEST.MF

    MANIFEST.MF的内容

    Manifest-Version: 1.0
    Created-By: 1.8.0_151 (Oracle Corporation)

      进入world 目录

      执行打包 jar -cvfm world.jar META-INFMANIFEST.MF *

      (2)Hello.jar

    import com.World;
    class Hello{
         public static void main(String[] agrs){
             System.out.println("hello "+World.say());
         }
     }

      新建target

      将Hello.java和world.jar复制到target下,进入target目录

      编译,生成class  javac -cp world.jar Hello.java

      删除Hello.java

      添加目录和文件  META-INF/MANIFEST.MF

    MANIFEST.MF的内容 

    Manifest-Version: 1.0
    Created-By: 1.8.0_151 (Oracle Corporation)
    Main-Class: Hello
    Class-Path: world.jar

      打包 jar -cvfm hello.jar META-INFMANIFEST.MF *

      运行 java -jar hello.jar

      输出 hello world

    说明:

       -cp 表示 -classpath,指的是把tom.jar加入classpath路径下

    4.带资源的打包  

      (1)资源在jar内

      Hello.java

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    class Hello{
         public static void main(String[] args) throws Exception {
            Hello hello = new Hello();
            InputStream is = hello.getClass().getResourceAsStream("aa.txt");
            print(is);
        }
    
        public static void print(InputStream inputStream) throws Exception {
            InputStreamReader reader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader br = new BufferedReader(reader);
            String s = "";
            while ((s = br.readLine()) != null)
                System.out.println(s);
            inputStream.close();
        }
     }

      新建resource

      编译 javac Hello.java -d resource

      添加目录和文件  META-INF/MANIFEST.MF

    MANIFEST.MF的内容 

    Manifest-Version: 1.0
    Created-By: 1.8.0_151 (Oracle Corporation)
    Main-Class: Hello

      添加文本文件aa.txt,输入点内容

      进入resource目录

      打包  jar -cvfm hello.jar META-INFMANIFEST.MF *

      运行  java -jar hello.jar

      输出 文件内容

      (2)资源在另一个jar包内

        <1>资源包reource.jar

      

          新建目录 r1

          添加文件 aa.txt

          添加目录和文件  META-INF/MANIFEST.MF

    MANIFEST.MF的内容 

    Manifest-Version: 1.0
    Created-By: 1.8.0_151 (Oracle Corporation)

          打包  jar -cvfm resource.jar META-INFMANIFEST.MF  *

        <2> hello.jar

          Hello.jave

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    class Hello{
         public static void main(String[] args) throws Exception {
            Hello hello = new Hello();
            InputStream is = hello.getClass().getResourceAsStream("aa.txt");
            print(is);
        }
    
        public static void print(InputStream inputStream) throws Exception {
            InputStreamReader reader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader br = new BufferedReader(reader);
            String s = "";
            while ((s = br.readLine()) != null)
                System.out.println(s);
            inputStream.close();
        }
     }

          resource目录只保留META-INF/MANIFEST.MF,内容为

    Manifest-Version: 1.0
    Created-By: 1.8.0_151 (Oracle Corporation)
    Main-Class: Hello
    Class-Path: resource.jar

          添加resource.jar

          

          编译 javac -cp resource/resource.jar Hello.java -d resource

          打包 jar -cvfm hello.jar META-INFMANIFEST.MF *
       (3)资源在jar包外

        Hello.java

    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    
    class Hello {
        public static void main(String[] args) throws Exception {
            Hello hello = new Hello();
            InputStream is = new FileInputStream("aa.txt");
            print(is);
        }
    
        public static void print(InputStream inputStream) throws Exception {
            InputStreamReader reader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader br = new BufferedReader(reader);
            String s = "";
            while ((s = br.readLine()) != null)
                System.out.println(s);
            inputStream.close();
        }
    }

        

        编译javac  Hello.java -d resource

        进入resource

        MANIFEST.MF内容为

    Manifest-Version: 1.0
    Created-By: 1.8.0_151 (Oracle Corporation)
    Main-Class: Hello

        打包 jar -cvfm hello.jar META-INFMANIFEST.MF *

        新建aa.txt,输入内容

        运行 java -jar hello.jar 

        输出aa.txt的内容

    注意:

      META-INF/MANIFEST     

    Manifest-Version: 1.0  
    Main-Class: package.classname    
    Class-Path: a.jar b.jar

      后面跟着一个英文的冒号,冒号后面必须跟着一个空格 

      Class-Path中的各项应使用空格分隔,不是逗号或分号

      Class-Path中如果有很多项,写成一行打包的时候会报错line too long,这时需要把Class-Path分多行写

      从第二行开始,必须以两个空格开头,一个空格结尾

      Class-Path写完之后最后一定要有一个空行

    说明:

      程序中System.out.println输出中文乱码的解决方法

        编译时指定编码为UTF-8

        javac -encoding utf-8 Hello.java

  • 相关阅读:
    C++操作Kafka使用Protobuf进行跨语言数据交互
    聊聊Disruptor 和 Aeron 这两个开源库
    DTrace arg0-kernel mode and arg1-user mode
    top
    how to write your first linux device driver
    how to compile and replace ubuntu kernel
    linux du
    c++ rvo vs std::move
    【Android】wifi开发
    无线局域网络 WIFI/WAPI/WLAN区别浅析
  • 原文地址:https://www.cnblogs.com/baby123/p/10875249.html
Copyright © 2011-2022 走看看