1. 程式人生 > >JavaSE(十一)Maven、XML和JSON

JavaSE(十一)Maven、XML和JSON

Maven、XML和JSON

Maven

Maven是一個Java專案管理和構建的工具
Maven使用pom.xml定義專案內容,並使用預設的目錄結構
在這裡插入圖片描述
在Maven中宣告一個依賴項可以自動下載並匯入classpath
Maven使用 groupIdartifactIdversion唯一定位一個jar包

<?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.yw</groupId> <artifactId>hello</artifactId
>
<version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>hello</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding
>
<java.version>1.8</java.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --> <plugin> <artifactId>maven-site-plugin</artifactId> <version>3.7.1</version> </plugin> <plugin> <artifactId>maven-project-info-reports-plugin</artifactId> <version>3.0.0</version> </plugin> </plugins> </pluginManagement> </build> </project>

依賴管理

Maven通過解析依賴關係確定專案所需的jar包,Maven庫查詢:
https://mvnrepository.com/,Maven中央倉庫:http://repo1.maven.org
Maven的依賴關係:

scope 說明 例項
compile 編譯時需要用到該jar包 commons-logging
test 編譯test時需要用到該jar包 junit
runtime 編譯時不需要,但執行時需要用到 log4j
provided 編譯時需要用到,但執行時由JDK或某個伺服器提供 servlet-api

Maven從中央倉庫下載所需jar包並快取在本地
可以通過映象加速下載 aliyun 映象倉庫配置:

<settings>
	<mirrors>
		<mirror>
			<id>aliyun</id>
			<name>aliyun</name>
			<url>http://maven.aliyun.com/nexus/content/groups/public</url>
			<mirrorOf>central</mirrorOf>
		</mirror>
	</mirrors>
</settings>

構建流程

在這裡插入圖片描述
理解Maven的概念:Lifecycle(生命週期),Phase(階段)和Goal:

使用Maven構建專案就是執行Lifecycle
執行Lifecycle就是按順序執行一系列Phase
每執行一個Phase,都會執行該Phase繫結的若干個Goal
Goal是最小執行任務單元

常用命令:

mvn clean compile
mvn test package
mvn clean package(不會打包依賴的jar)
java -cp ./hello-0.0.1-SNAPSHOT.jar com.yw.hello.App

使用外掛

Maven通過自定義外掛可以執行專案構建時需要的額外的功能,在pom.xml中宣告外掛及配置,外掛會在某個Phase被執行,外掛的配置和用法需參考外掛官方文件
Maven常用標準外掛

外掛名稱 對應執行的Phase
clean clean
complier compile
surefire test
jar package

常用外掛:

maven-shade-plugin:打包所有依賴包並生成可執行jar
cobertura-maven-plugin:生成單元測試覆蓋率報告
findbugs-maven-plugin:對Java原始碼進行靜態分析以找出潛在問題
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-shade-plugin</artifactId>
	<version>3.2.1</version>
	<executions>
		<execution>
	    <phase>package</phase>
	    <goals>
	      <goal>shade</goal>
	    </goals>
	    <configuration>
	      <transformers>
	        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
	          <mainClass>com.yw.hello.App</mainClass>
	        </transformer>
	      </transformers>
	    </configuration>
	  </execution>
	</executions>
</plugin>

模組管理

Maven支援模組化管理,可以把一個大專案拆成一個模組
可以通過繼承在parent的pom.xml統一定義重複配置
可以通過<modules>編譯多個模組

XML和JSON

XML
XML是可擴充套件標記語言(eXtensible Markup Language),純文字資料,預設使用UTF-8編碼,用於表示複雜的結構化資料,用於資料的儲存和傳輸,資料龐大,格式複雜。

XML相關技術

DTD和XSD:驗證XML結構和資料是否有效
Namespace:XML節點和屬性的名字空間
XSLT:把XML轉化為另一種文字
XPath:一種XML節點查詢語言

兩種標準的解析XML的API:DOM、SAX
DOM(Document Object Model)
Java DOM API:將XML解析為DOM,可在記憶體中完整表示XML資料結構,解析速度慢,記憶體佔用大

public class DomSample {
	static final String XML_URL = "https://www.baidu.com";
	public static void main(String[] args) throws Exception{
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.parse(XML_URL);
		printNode(doc, 0);
	}
	static void printNode(Node n, int indent){
		for(int i=0; i<indent; i++){
			System.out.println("");
		}
		switch(n.getNodeType()){
		case Node.DOCUMENT_NODE:
			System.out.println("Document: " + n.getNodeName());
			break;
		case Node.ELEMENT_NODE:
			System.out.println("Element: " + n.getNodeName());
			break;
		case Node.TEXT_NODE:
			System.out.println("Text: " + n.getNodeName() + " = " + n.getNodeValue());
			break;
		case Node.ATTRIBUTE_NODE:
			System.out.println("Attr: " + n.getNodeName() + " = " + n.getNodeValue());
			break;
		case Node.CDATA_SECTION_NODE:
			System.out.println("CDATA: " + n.getNodeName() + " = " + n.getNodeValue());
			break;
		case Node.COMMENT_NODE:
			System.out.println("Comment: " + n.getNodeName() + " = " + n.getNodeValue());
			break;
		default:
			System.out.println("NodeType: " + n.getNodeType() + ", NodeName: " + n.getNodeName());
		}
		for(Node child = n.getFirstChild(); child != null; child = child.getNextSibling()){
			printNode(child, indent + 1);
		}
	}
}

SAX(Simple API for XML)
Java SAX解析:一種流式解析XML的API,通過事件觸發,速度快,呼叫方通過回撥方法獲得資料

class MyHandler extends DefaultHandler{
	void print(Object... objs){
		for(Object obj : objs){
			System.out.print(obj);
			System.out.print(" ");
		}
		System.out.println();
	}
	@Override
	public void startDocument() throws SAXException{
		print("start document");
	}
//	@Override
	public void endDocumnet() throws SAXException{
		print("end document");
	}
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{
		print("start element:", localName, qName);
	}
	@Override
	public void endElement(String uri, String localName, String qName)throws SAXException{
		print("end element:", localName, qName);
	}
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException{
		print("characters:", new String(ch, start, length));
	}
	@Override
	public void error(SAXParseException e) throws SAXException{
		print("error:", e);
	}
}
public class SAXSample {
	static final String XML_URL = "https://www.zte.com.cn";
	public static void main(String[] args) throws Exception{
		SAXParserFactory spf = SAXParserFactory.newInstance();
		SAXParser sp = spf.newSAXParser();
		sp.parse(XML_URL, new MyHandler());
	}
}

Jackson
JSON是輕量級的資料表現方式,格式簡單,解析速度快,適合Web
使用Jackson可以快速在XML和JavaBean之間互相轉換,Jackson提供了讀寫JSON的API:實現JSON和JavaBean的互相轉換,可使用Annotation定製序列化和反序列化
讀取XML:

XmlMapper mapper = new XmlMapper();
Book book = mapper.readValue(xml, Book.class);

寫入XML:

XmlMapper mapper = new XmlMapper();
String xml = mapper.writeValueAsString(book);

Json轉JavaBean

class Book {
	public String id;
	public String title;
	public String subtitle;
	public List<String> author;
	@JsonSerialize(using = CustomLocalDateSerializer.class)
	@JsonDeserialize(using = CustomLocalDateDeserializer.class)
	public LocalDate pubdate;
	public String url;
	public String price;
}
class SearchResult {
	public long count;
	public long total;
	public List<Book> books;
}
class CustomLocalDateDeserializer extends JsonDeserializer<LocalDate> {
	static DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-M-d", Locale.US);
	@Override
	public LocalDate deserialize(JsonParser p, DeserializationContext ctxt)
			throws IOException, JsonProcessingException {
		String s = p.getValueAsString();
		if (s != null) {
			try {
				return LocalDate.parse(s, FORMATTER);
			} catch (DateTimeException e) {
				// ignore
			}
		}
		return null;
	}
}
class CustomLocalDateSerializer extends JsonSerializer<LocalDate> {
	@Override
	public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
		gen.writeString(value.toString());
	}
}
public class JsonToBean {
	static final String JSON_URL = "https://api.douban.com/v2/book/search?q=";

	public static void main(String[] args) throws Exception {
		ObjectMapper mapper = new ObjectMapper()
				.registerModule(new JavaTimeModule());
		mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
				false);
		String json = search("java");
		SearchResult result = mapper.readValue(json, SearchResult.class);
		System.out.println(mapper.writerWithDefaultPrettyPrinter()
				.writeValueAsString(result));
	}

	static String search(String q) {
		HttpURLConnection conn = null;
		StringBuilder sb = new StringBuilder(4096);
		try {
			URL url = new URL(JSON_URL + URLEncoder.encode(q, "UTF-8"));
			conn = (HttpURLConnection) url.openConnection();
			if (200 == conn.getResponseCode()) {
				try (BufferedReader reader = new BufferedReader(
						new InputStreamReader(conn.getInputStream(), "UTF-8"))) {
					char[] buffer = new char[1024];
					for (;;) {
						int n = reader.read(buffer);
						if (n == (-1)) {
							break;
						}
						sb.append(buffer, 0, n);
					}
				}
				return sb
            
           

相關推薦

JavaSEMavenXMLJSON

Maven、XML和JSON Maven 依賴管理 構建流程 使用外掛 模組管理 XML和JSON Maven Maven是一個Java專案管理和構建的工具 Maven使用pom.xml定義專案

Python學習筆記關鍵字函式方法

關鍵字是 Python內建的、具有特殊意義的識別符號            關鍵字後面不需要使用括號   函式封裝了獨立功能,可以直接呼叫        

Python學習筆記關鍵字函數方法

python 選擇 使用 通過 標識 很多 div 方法 針對 關鍵字是 Python內置的、具有特殊意義的標識符 關鍵字後面不需要使用括號 函數封裝了獨立功能,可以直接調用 函數名(參數)

【GANs學習筆記】DCGANImprovedDCGAN

在這一部分我們開始探討generator與discriminator內部網路的結構,之前我們一直在探討二者在外部的連線方式和如何使用divergence能讓結果更好,而涉及到generator與discriminator本身時一直粗略地描述成神經網路,但其實,

java基礎學習總結:自動裝箱自動拆箱

自動拆箱和自動裝箱 Java為每種基本資料型別都提供了對應的包裝器型別。舉個例子: public class TestMain { public static void main(String[] args) { Integer i = 10; } }

Java語言學習:列舉型別泛型

    Java中一個重要的型別:列舉,它可以用來表示一組取值範圍固定的變數,使用 enum 關鍵字定義列舉型別,其中元素不能重複,通常大寫表示。利用Java的反射機制,可以在執行時分析類,如檢視列舉型別的修飾符、父類和自定義方法等,下面簡單說下。    

Vue+Koa2移動電商實戰 前後端通訊跨域處理

今天學習的是前後端的通訊和後端跨域的處理 首先安裝koa-bodyparser中介軟體到我們專案中來,以便我們後端接收前端傳送過來的請求 npm install --save koa-bodyparser 安裝完成後在service/index.js中引入 const bodyPars

Java筆記通用容器類總結

結構 翻轉 隨機 抽象 clear out 內部類 依賴 keys 通用容器類和總結 一、抽象容器類 一)AbstractCollection 提供了Collection接口的基礎實現,具體來說,實現了如下方法: public boolean addAll(Collec

【TeeChart Pro ActiveX教程】:縮放滾動

下載TeeChart Pro ActiveX最新版本 如何使用滑鼠進行縮放和滾動 縮放 要放大圖表,請在要放大的區域的左上角按住滑鼠左鍵並按住滑鼠按鈕,將矩形拖動到縮放區域的右下角。釋放滑鼠按鈕,圖表將重繪所選區域。 要撤消縮放,請在“Chart”區域的任意位置按滑鼠左鍵,然後按住滑鼠按鈕向上和向左

【D3.js資料視覺化系列教程】--更新過度動畫

//(1) 準備資料集 var dataset = [ 5, 10, 13, 19, 21, 25, 22, 18, 15, 13, 11, 12, 15, 20, 18, 17, 16, 18, 23, 25 ]; //(2) 設定SVG的高寬 var w=600; va

【SpringCloud】:超時機制斷路器及 Hystrix簡單實踐

  上篇文章我們配置了Eureka叢集,實現了高可用。在微服務框架中,一個服務消費者可能是其他服務消費者的提供者,而當低層次的服務提供者出現問題時,會導致系統資源被耗盡。出現雪崩效應。 Hystri

讀書筆記-定時器時間管理

系統中有很多與時間相關的程式(比如定期執行的任務,某一時間執行的任務,推遲一段時間執行的任務),因此,時間的管理對於linux來說非常重要. 主要內容: 系統時間 定時器 定時器相關概念 定時器執行流程 實現程式延遲的方法 定時器和延遲的例子 1.系

ROS的學習ROS的msgsrv

     msg是一個描述ROS中訊息的域的簡單的文字檔案,它用來為訊息產生不同語言的原始碼。      一個srv檔案描述一個服務,它由兩部分組成,請求和服務。      msg檔案被儲存在一個包的msg目錄下,srv檔案被儲存在srv目錄下。msg是簡單的文字檔案,它的

Redis詳解------ 過期刪除策略記憶體淘汰策略

  在介紹這篇文章之前,我們先來看如下幾個問題:   ①、如何設定Redis鍵的過期時間?   ②、設定完一個鍵的過期時間後,到了這個時間,這個鍵還能獲取到麼?假如獲取不到那這個鍵還佔據著記憶體嗎?   ③、如何設定Redis的記憶體大小?當記憶體滿了之後,Redis有哪些記憶體淘汰策略?我們又該如何選擇?

Java 多執行緒基礎執行緒優先順序守護執行緒

 Java 多執行緒基礎(十一)執行緒優先順序和守護執行緒 一、執行緒優先順序 Java 提供了一個執行緒排程器來監控程式啟動後進去就緒狀態的所有執行緒。執行緒排程器通過執行緒的優先順序來決定排程哪些執行緒執行。一般來說,Java的執行緒排程器採用時間片輪轉演算法使多個執行緒輪轉獲得CPU的時間片。

js——簡單物件建立json

//建立物件 //1.用object類建立一個物件,這種方式不能重用 沒有約束 操作容易出問題 var person=new Object(); person.name="lq"; person.age="21"; person.say=function(){ alert

學習筆記——數據庫的索引碎片計劃緩存統計信息

部分 null 文章 mage like 分享 show not 決定 1.索引碎片 數據庫存儲本身是無序的,建立了聚集索引,會按照聚集索引物理順序存入硬盤。既鍵值的邏輯順序決定了表中相應行的物理順序 而且在大多數的情況下,數據庫寫入頻率遠低於讀取頻率,索引的存在為了讀

Linux學習筆記用戶組管理 用戶管理

.net nologin follow 另一個 window ftp log product windows文件 一、linux和windows互傳文件 目前我所學到的linux與windows互傳文件的方法有兩種; yum install -y lrzsz輸入sz

C之 enumsizeoftypedef

C語言 enum sizeof typedef 在 C 語言中經常會見到 enum、sizeof、typedef,那麽我們今天就來講解下它們三個。 首先 enum 是 C 語言中的一種自定義類型,它是一種枚舉類型。enum 值是可以根據需要自定義的整型值,第一個定

【JMeter4.0學習】之JMeter對MysqlOracle數據庫性能測試腳本開發

conn 遇到的問題 mys .cn SQ 數據庫性能測試 pos rac 問題總結 一、MySQL數據庫鏈接: 註:下面所產生的問題一律參考詳見:《【JMeter4.0】之遇到的問題總結(持續更新)》(包括Mysql、Orcale) 準備:引包,包路徑一定要放對位置,