手把手教java——手动编译可执行jar包

这是一篇新手教!关于手动编译java源代码并打包为可执行jar包,不使用类似Intellij IDEA等IDE。

如果你是从来没接触过类似dos的操作,请认真阅读,一步一步做好笔记,一定要实战操作。

本文基于windows平台。

一:编辑源代码

1.在任何地方(推荐桌面)创建一个文件夹fileupload,如图所示。注意如果你是新手,请一步一步照做,后面的会跟前面有关联,除非你很了解java。

接着在fileupload文件夹中创建src文件夹,在src文件夹中创建java文件夹,不要觉得麻烦,后面你就知道有多重要了的。

说明:fileupload是工程文件夹,src是源代码文件夹,java文件夹表示里面放的java代码

手把手教java——手动编译可执行jar包_第1张图片


2.在fileupload文件夹下创建两个java源代码文件,分别是FileUpload.java、Md5.java,直接复制,不要修改任何代码。

FileUpload.java文件内容如下

package net.lastcoder.tools.fileupload;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * auth: WenYF
 * date: 2017/4/2 0002
 */
public class FileUpload {

    public static final void main(String[] args) {
        System.out.println("fileupload...");
        String addr = args[0];
        String filePath = args[1];
        System.out.println("url=" + addr);
        System.out.println("filePath=" + filePath);
        new net.lastcoder.tools.fileupload.FileUpload(addr, filePath);
    }

    FileUpload(String addr, String filePath) {
        File file = new File(filePath);
        if (!file.exists()) {
            System.out.println("file not exist.");
            return;
        }

        String md5 = Md5.sum(file.getAbsolutePath());
        try {
            URL url = new URL(addr);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestProperty("md5", md5);
            connection.setRequestProperty("filename", file.getName());
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            connection.setConnectTimeout(5000);
            connection.connect();
            OutputStream os = connection.getOutputStream();
            FileInputStream fis = new FileInputStream(file);
            byte[] buffer = new byte[fis.available()];
            int size = fis.read(buffer);
            os.write(buffer, 0, size);

            fis.close();
            os.close();

            InputStream is = connection.getInputStream();

            StringBuilder sb = new StringBuilder();
            byte[] readBuffer = new byte[1024];
            while ((size = is.read(readBuffer)) != -1) {
                for (int i = 0; i < size; i++) {
                    sb.append((char)readBuffer[i]);
                }
            }

            System.out.println("code:" + connection.getResponseCode()
                    + ",msg=" + connection.getResponseMessage());
            System.out.println("content:" + sb.toString());

            connection.disconnect();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Md5.java内容如下

package net.lastcoder.tools.fileupload;

import java.io.FileInputStream;
import java.io.InputStream;
import java.security.MessageDigest;

/**
 * auth: WenYF
 * date: 2017/4/2 0002
 */
public class Md5 {
    private static final char HEX_DIGITS[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'A', 'B', 'C', 'D', 'E', 'F' };

    private static String toHexString(byte[] b) {
        StringBuilder sb = new StringBuilder(b.length * 2);
        for (int i = 0; i < b.length; i++) {
            sb.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]);
            sb.append(HEX_DIGITS[b[i] & 0x0f]);
        }
        return sb.toString();
    }

    public static String sum(String filename) {
        InputStream fis;
        byte[] buffer = new byte[1024];
        int numRead = 0;
        MessageDigest md5;
        try{
            fis = new FileInputStream(filename);
            md5 = MessageDigest.getInstance("MD5");
            while((numRead=fis.read(buffer)) > 0) {
                md5.update(buffer,0,numRead);
            }
            fis.close();
            return toHexString(md5.digest());
        } catch (Exception e) {
            System.out.println("error");
            return null;
        }
    }
}

二:编译源代码

1.在fileupload文件夹创建一个bin文件夹,该文件夹将会存放可执行jar包和编译好的class文件

接着在bin文件夹中创建一个classes的文件夹,该文件夹是用来存放编译好的java字节码class文件

2.好了,回到fileupload目录

按住shift+鼠标右键,选择“在此处打开命令窗口”

手把手教java——手动编译可执行jar包_第2张图片

或者在开开始菜单输出“cmd”命令,进入到upload文件夹。(不知道请百度打开dos到指定文件夹)

输入如下命令:javac -sourcepath ./src/java/  src/java/Md5.java src/java/FileUpload.java -d ./bin/classes -verbose,按回车编译,不要关闭dos窗口。


这里你-sourcepath表示源代码路径,-d表示输出文件夹

你可以试着去掉-sourcepath后面的 ./src/java,来体会体会。

3.前往bin/classes目录,你将会发现自动生成了很多文件夹,这里如果你对知识好奇,可以看看源代码的第一行代码。

在classes文件夹的最深处生成了FileUpload.class和Md5.class文件

手把手教java——手动编译可执行jar包_第3张图片

现在源代码已经编译好,接下来就是打包了。


三:打包为可以执行jar包

1.可执行jar一般指有默认的入口,不用去指定。

默认入口通过MANIFEST.MF文件来指定。

因此,在fileupload/bin文件夹下创建一个文件叫MANIFEST.MF,并输入

Manifest-Version: 1.0  
Created-By: WenYF   
Main-Class: net.lastcoder.tools.fileupload.FileUpload

手把手教java——手动编译可执行jar包_第4张图片

其中Manifest-Version: 为固定1.0,Main-Class:为主函数入口,还有:后面要有空格,并空两行

2.打开dos窗口,输入jar cvfm ./bin/fileupload.jar ./bin/MANIFEST.MF -C ./bin/classes ./net,按回车


其中注意是cvfm,是cvfm,是cvfm,别高错了。 后面指定jar包名,接着是mf文件, -C指定在那个目录有class文件,最后./net表示起始位置

3.好了,你将在bin目录下看到fileupload.jar了。


四:运行jar包

1.打开dos窗口,输入:java -jar .\bin\fileupload.jar http://localhost:9528/file .\src\java\FileUpload.java,你将会看到如下

手把手教java——手动编译可执行jar包_第5张图片

出现异常是因为没有服务器,服务器将会在会面讲。

好了,到这里就已经结束了。

谢谢大家捧场

你可能感兴趣的:(java)