本次本篇使用的工具是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;
}
}

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>
=============================================================================================================================================
【解釋一下,直接使用的可以跳過】:
》》(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
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.最后,就可以把這個單獨創建的項目 刪除就好了
再來補充一篇是idea直接用來打包的
IDEA環境配置——把類封裝為jar工具包以供他人調用
記錄一下
目錄
打包
File -> Project Structure

然后點左邊的Artifacts ,點旁邊的綠色加號

新建一個空的jar

隨便起個名字,點下圖我圈出來的那個綠色的加號

然后選module output,點開把你要打包的module加進去

然后點ok
開始打包:Build->BuildArtifacts->你剛剛加的jar包名字-->build

打包成功的文件在你的項目->classes->artifacts->你剛才起的jar包名 下

調用
還是找到File->Project Structure
在Modules模塊:選中你要導入包的modules,然后在右邊的Dependencies選項里面點右邊的加號

選第一個jars,找到你剛才打的jar包,然后引入jar包

點ok
就ok了。

