【Maven jar】打包單個或多個文件,有依賴jar包的將架包一起打包成一個jar包供別的項目引用


之前有一片文章,是打包單個java文件的。這次想要將http://www.cnblogs.com/sxdcgaq8080/p/8398780.html  打包成jar包,發現這個java文件中引用了多個第三方的jar,想要單獨進行編譯都無法通過,更不要說打包成jar了。

 

所以就營運而生了這個需求,怎么打包單個java文件或多個java文件,將文件中引用的依賴的jar包共同打包成一個jar供別的項目引用。

本次本篇使用的工具是Maven中的

maven-assembly-plugin

插件。

======================================================================================================

1.首先,需要新建一個maven項目,將單個或多個java文件拷貝到本項目中

例如,下面這個QR_Code.java文件

package com.sxd.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import com.google.zxing.*;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * 二維碼工具類
 * @author SXD
 * @Date 2018.2.1
 *
 */
public class QR_Code {
    private static int BLACK = 0x000000;
    private static int WHITE = 0xFFFFFF;

    /**
     * 內部類,設置二維碼相關參數
     */
    @Data(staticConstructor = "of")
    @NoArgsConstructor
    @AllArgsConstructor
    @Accessors(chain = true)
    public  class CodeModel {
        /**
         * 正文
         */
        private String contents;
        /**
         * 二維碼寬度
         */
        private int width = 400;
        /**
         * 二維碼高度
         */
        private int height = 400;
        /**
         * 圖片格式
         */
        private String format = "png";
        /**
         * 編碼方式
         */
        private String character_set = "utf-8";
        /**
         * 字體大小
         */
        private int fontSize = 12;
        /**
         * logo
         */
        private File logoFile;
        /**
         * logo所占二維碼比例
         */
        private float logoRatio = 0.20f;
        /**
         * 二維碼下文字
         */
        private String desc;
        private int whiteWidth;//白邊的寬度
        private int[] bottomStart;//二維碼最下邊的開始坐標
        private int[] bottomEnd;//二維碼最下邊的結束坐標
    }


    /**
     * 1.創建最原始的二維碼圖片
     * @param info
     * @return
     */
    private BufferedImage createCodeImage(CodeModel info){

        String contents = info.getContents() == null || "".equals(info.getContents())  ? "暫無內容" : info.getContents();//獲取正文
        int width = info.getWidth();//寬度
        int height = info.getHeight();//高度
        Map<EncodeHintType, Object> hint = new HashMap<EncodeHintType, Object>();
        hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//設置二維碼的糾錯級別【級別分別為M L H Q ,H糾錯能力級別最高,約可糾錯30%的數據碼字】
        hint.put(EncodeHintType.CHARACTER_SET, info.getCharacter_set());//設置二維碼編碼方式【UTF-8】
        hint.put(EncodeHintType.MARGIN, 0);

        MultiFormatWriter writer = new MultiFormatWriter();
        BufferedImage img = null;
        try {
            //構建二維碼圖片
            //QR_CODE 一種矩陣二維碼
            BitMatrix bm = writer.encode(contents, BarcodeFormat.QR_CODE, width, height, hint);
            int[] locationTopLeft = bm.getTopLeftOnBit();
            int[] locationBottomRight = bm.getBottomRightOnBit();
            info.setBottomStart(new int[]{locationTopLeft[0], locationBottomRight[1]});
            info.setBottomEnd(locationBottomRight);
            int w = bm.getWidth();
            int h = bm.getHeight();
            img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
            for(int x=0;x<w;x++){
                for(int y=0;y<h;y++){
                    img.setRGB(x, y, bm.get(x, y) ? BLACK : WHITE);
                }
            }
        } catch (WriterException e) {
            e.printStackTrace();
        }
        return img;
    }

    /**
     * 2.為二維碼增加logo和二維碼下文字
     * logo--可以為null
     * 文字--可以為null或者空字符串""
     * @param info
     * @param output
     */
    private void dealLogoAndDesc(CodeModel info, OutputStream output){
        //獲取原始二維碼圖片
        BufferedImage bm = createCodeImage(info);
        //獲取Logo圖片
        File logoFile = info.getLogoFile();
        int width = bm.getWidth();
        int height = bm.getHeight();
        Graphics g = bm.getGraphics();

        //處理logo
        if(logoFile!=null && logoFile.exists()){
            try{
                BufferedImage logoImg = ImageIO.read(logoFile);
                int logoWidth = logoImg.getWidth();
                int logoHeight = logoImg.getHeight();
                float ratio = info.getLogoRatio();//獲取Logo所占二維碼比例大小
                if(ratio>0){
                    logoWidth = logoWidth>width*ratio ? (int)(width*ratio) : logoWidth;
                    logoHeight = logoHeight>height*ratio ? (int)(height*ratio) : logoHeight;
                }
                int x = (width-logoWidth)/2;
                int y = (height-logoHeight)/2;
                //根據logo 起始位置 和 寬高 在二維碼圖片上畫出logo
                g.drawImage(logoImg, x, y, logoWidth, logoHeight, null);
            }catch(Exception e){
                e.printStackTrace();
            }
        }

        //處理二維碼下文字
        String desc = info.getDesc();
        if(!(desc == null || "".equals(desc))){
            try{
                //設置文字字體
                int whiteWidth = info.getHeight()-info.getBottomEnd()[1];
                Font font = new Font("黑體", Font.BOLD, info.getFontSize());
                int fontHeight = g.getFontMetrics(font).getHeight();
                //計算需要多少行
                int lineNum = 1;
                int currentLineLen = 0;
                for(int i=0;i<desc.length();i++){
                    char c = desc.charAt(i);
                    int charWidth = g.getFontMetrics(font).charWidth(c);
                    if(currentLineLen+charWidth>width){
                        lineNum++;
                        currentLineLen = 0;
                        continue;
                    }
                    currentLineLen += charWidth;
                }
                int totalFontHeight = fontHeight*lineNum;
                int wordTopMargin = 4;
                BufferedImage bm1 = new BufferedImage(width, height+totalFontHeight+wordTopMargin-whiteWidth, BufferedImage.TYPE_INT_RGB);
                Graphics g1 = bm1.getGraphics();
                if(totalFontHeight+wordTopMargin-whiteWidth>0){
                    g1.setColor(Color.WHITE);
                    g1.fillRect(0, height, width, totalFontHeight+wordTopMargin-whiteWidth);
                }
                g1.setColor(new Color(BLACK));
                g1.setFont(font);
                g1.drawImage(bm, 0, 0, null);
                width = info.getBottomEnd()[0]-info.getBottomStart()[0];
                height = info.getBottomEnd()[1]+1;
                currentLineLen = 0;
                int currentLineIndex = 0;
                int baseLo = g1.getFontMetrics().getAscent();
                for(int i=0;i<desc.length();i++){
                    String c = desc.substring(i, i+1);
                    int charWidth = g.getFontMetrics(font).stringWidth(c);
                    if(currentLineLen+charWidth>width){
                        currentLineIndex++;
                        currentLineLen = 0;
                        g1.drawString(c, currentLineLen + whiteWidth, height+baseLo+fontHeight*(currentLineIndex)+wordTopMargin);
                        currentLineLen = charWidth;
                        continue;
                    }
                    g1.drawString(c, currentLineLen+whiteWidth, height+baseLo+fontHeight*(currentLineIndex) + wordTopMargin);
                    currentLineLen += charWidth;
                }
                g1.dispose();
                bm = bm1;
            }catch(Exception e){
                e.printStackTrace();
            }
        }

        try{
            ImageIO.write(bm, (info.getFormat() == null || "".equals(info.getFormat())) ? info.getFormat() : info.getFormat(), output);
        }catch(Exception e){
            e.printStackTrace();
        }
    }


    /**
     * 3.創建 帶logo和文字的二維碼
     * @param info
     * @param file
     */
    public void createCodeImage(CodeModel info, File file){
        File parent = file.getParentFile();
        if(!parent.exists())parent.mkdirs();
        OutputStream output = null;
        try{
            output = new BufferedOutputStream(new FileOutputStream(file));
            dealLogoAndDesc(info, output);
            output.flush();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try {
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 3.創建  帶logo和文字的二維碼
     * @param info
     * @param filePath
     */
    public void createCodeImage(CodeModel info, String filePath){
        createCodeImage(info, new File(filePath));
    }

    /**
     * 4.創建  帶logo和文字的二維碼
     * @param filePath
     */
    public void createCodeImage(String contents,String filePath){
        CodeModel codeModel = new CodeModel();
        codeModel.setContents(contents);
        createCodeImage(codeModel, new File(filePath));
    }


    /**
     * 5.讀取 二維碼 獲取二維碼中正文
     * @param input
     * @return
     */
    public String decode(InputStream input){
        Map<DecodeHintType, Object> hint = new HashMap<DecodeHintType, Object>();
        hint.put(DecodeHintType.POSSIBLE_FORMATS, BarcodeFormat.QR_CODE);
        String result = "";
        try{
            BufferedImage img = ImageIO.read(input);
            int[] pixels = img.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth());
            LuminanceSource source = new RGBLuminanceSource(img.getWidth(), img.getHeight(), pixels);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            QRCodeReader reader = new QRCodeReader();
            Result r = reader.decode(bitmap, hint);
            result = r.getText();
        }catch(Exception e){
            result="讀取錯誤";
        }
        return result;
    }



}
View Code

 

2.完善pom.xml文件,除了項目中依賴的jar的引用,還需要maven-assembly-plugin插件

<?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.0</modelVersion>

    <groupId>com.sxd.util</groupId>
    <artifactId>QR_Code</artifactId>
    <version>1.1-SNAPSHOT</version>

    <dependencies>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
        </dependency>
        <!-- google提供二維碼生成和解析https://mvnrepository.com/artifact/com.google.zxing/core -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <artifactId> maven-assembly-plugin </artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.sxd.util.QR_Code</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>
View Code

 

 

=============================================================================================================================================

【解釋一下,直接使用的可以跳過】:

》》(1)打包出來的jar包,是以

    <groupId>com.sxd.util</groupId>
    <artifactId>QR_Code</artifactId>
    <version>1.1-SNAPSHOT</version>

{artifactId}-{version}.jar命名的

》》(2)maven-assembly-plugin插件中

默認情況下,maven-assembly-plugin內置了幾個可以用的assembly descriptor:

  • bin : 類似於默認打包,會將bin目錄下的文件打到包中
  • jar-with-dependencies : 會將所有依賴都解壓打包到生成物中【本次需求正好是將所有依賴也打包】
  • src :只將源碼目錄下的文件打包
  • project : 將整個project資源打包

》》(3)針對於maven-assembly-plugin插件中的

 ===================================================================================================================================================

3.使用IDEA的同志們,雙擊插件 即可執行打包指令

 

執行完整的語句如下:

"C:\Program Files\Java\jdk1.8.0_131\bin\java" -Dmaven.multiModuleProjectDirectory=G:\ideaProjects\B\sxdproject -Dmaven.home=C:\Users\SXD\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\173.3727.127\plugins\maven\lib\maven3 -Dclassworlds.conf=C:\Users\SXD\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\173.3727.127\plugins\maven\lib\maven3\bin\m2.conf -javaagent:C:\Users\SXD\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\173.3727.127\lib\idea_rt.jar=58262:C:\Users\SXD\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\173.3727.127\bin -Dfile.encoding=UTF-8 -classpath C:\Users\SXD\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\173.3727.127\plugins\maven\lib\maven3\boot\plexus-classworlds-2.5.2.jar org.codehaus.classworlds.Launcher -Didea.version=2017.3 org.apache.maven.plugins:maven-assembly-plugin:2.2-beta-5:assembly
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building QR_Code 1.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] >>> maven-assembly-plugin:2.2-beta-5:assembly (default-cli) > package @ QR_Code >>>
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ QR_Code ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ QR_Code ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to G:\ideaProjects\B\sxdproject\target\classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ QR_Code ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory G:\ideaProjects\B\sxdproject\src\test\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ QR_Code ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ QR_Code ---
[INFO] No tests to run.
[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ QR_Code ---
[INFO] Building jar: G:\ideaProjects\B\sxdproject\target\QR_Code-1.1-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-assembly-plugin:2.2-beta-5:single (make-assembly) @ QR_Code ---
[INFO] META-INF/MANIFEST.MF already added, skipping
[INFO] Building jar: G:\ideaProjects\B\sxdproject\target\QR_Code-1.1-SNAPSHOT-jar-with-dependencies.jar
[INFO] META-INF/MANIFEST.MF already added, skipping
[INFO] 
[INFO] <<< maven-assembly-plugin:2.2-beta-5:assembly (default-cli) < package @ QR_Code <<<
[INFO] 
[INFO] --- maven-assembly-plugin:2.2-beta-5:assembly (default-cli) @ QR_Code ---
[INFO] META-INF/MANIFEST.MF already added, skipping
[INFO] Building jar: G:\ideaProjects\B\sxdproject\target\QR_Code-1.1-SNAPSHOT-jar-with-dependencies.jar
[INFO] META-INF/MANIFEST.MF already added, skipping
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.319 s
[INFO] Finished at: 2018-02-01T16:30:47+08:00
[INFO] Final Memory: 23M/258M
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0
View Code

 

 

4.執行完成之后,項目結構會發生變化

 

5.把jar包拷出來,放在一個位置,就可以上傳到nexus上,放在maven私服里,給大家引用了【nexus私服搭建以及相關操作,查看http://www.cnblogs.com/sxdcgaq8080/p/7583767.html

當然,想更改jar的名字,也可以直接修改完成之后再進行如下操作

打開DOM窗口,執行如下命令

mvn deploy:deploy-file -DgroupId=sxd.jar -DartifactId=QR_Code -Dversion=1.1 -Dpackaging=jar -Dfile=G:\test\QR_Code-1.1-SNAPSHOT.jar -Durl=http://localhost:8081/repository/myself_hosted/ -DrepositoryId=myself_hosted

 

在http://localhost:8081/ 訪問nexus

查詢就可查看到

 

這樣在項目中引用如下:

<!--QR_Code二維碼使用工具包-->
        <dependency>
            <groupId>sxd.jar</groupId>
            <artifactId>QR_Code</artifactId>
            <version>1.1</version>
        </dependency>

 

 6.最后,就可以把這個單獨創建的項目 刪除就好了

 

END

=========================================

參考地址:https://www.cnblogs.com/f-zhao/p/6929814.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM