目錄
前言
什么是Maven
Maven的優(yōu)點(diǎn)
Maven的核心概念有哪些
POM是什么
什么是依賴管理
什么是插件
什么是倉(cāng)庫(kù)
概述
1、構(gòu)建
2、依賴
安裝與配置
1、下載
?2、Windows Maven安裝
1)解壓到指定目錄
2)配置環(huán)境變量
3)目錄結(jié)構(gòu)
3、配置
1.根目錄創(chuàng)建一個(gè)文件夾
2.settings.xml文件配置
3.settings.xml文件配置鏡像倉(cāng)庫(kù)
常用命令
創(chuàng)建Maven項(xiàng)目
1、手工創(chuàng)建
1)Maven項(xiàng)目目錄結(jié)構(gòu)
2)pom.xml配置文件
3)說(shuō)明
JUnit
1、概念
2、使用步驟
常用API
1)@Test注解
2)assertEquals()方法
3)assertTrue()和assertFalse()方法
4)assertNotNull()和assertNull()方法
5)@Before和@After注解
6)@BeforeClass和@AfterClass注解
7)@Ignore注解
Lombok
1、@Data注解
2、@AllArgsConstructor和@NoArgsConstructor注解
3、@Builder注解
總結(jié)
前言
Maven是一個(gè)開源的項(xiàng)目管理工具,它可以幫助開發(fā)人員自動(dòng)化構(gòu)建、測(cè)試和部署Java項(xiàng)目
什么是Maven
Maven是一個(gè)開源的項(xiàng)目管理工具,它可以幫助開發(fā)人員自動(dòng)化構(gòu)建、測(cè)試和部署Java項(xiàng)目。
- 統(tǒng)一管理Jar包的工具(處理Jar包的依賴和沖突問(wèn)題)
- 方便編譯和測(cè)試,打包代碼的工具
Maven的優(yōu)點(diǎn)
Maven可以自動(dòng)化構(gòu)建、測(cè)試和部署Java項(xiàng)目,減少了手動(dòng)操作的時(shí)間和錯(cuò)誤率。它還可以管理項(xiàng)目的依賴關(guān)系,避免了版本沖突和依賴缺失的問(wèn)題。
Maven的核心概念有哪些
Maven的核心概念包括項(xiàng)目對(duì)象模型(POM)、依賴管理、插件、倉(cāng)庫(kù)和生命周期。
POM是什么
POM是項(xiàng)目對(duì)象模型,它是Maven項(xiàng)目的核心文件,包含了項(xiàng)目的基本信息、依賴關(guān)系、構(gòu)建配置和插件等信息。
pom.xml 文件是Maven項(xiàng)目的核心文件(非常重要,Maven項(xiàng)目不能沒(méi)有pom)
pom.xml 他是干嘛的呢?
- 簡(jiǎn)單的來(lái)說(shuō),pom.xml就是對(duì)Moven項(xiàng)目的描述
什么是依賴管理
依賴管理是Maven的一個(gè)重要功能,它可以自動(dòng)管理項(xiàng)目的依賴關(guān)系,包括下載、安裝和更新依賴庫(kù);它提供了中央倉(cāng)庫(kù),能幫我們自動(dòng)下載構(gòu)件。
搜索網(wǎng)址,各種依賴都在這個(gè)網(wǎng)址里,點(diǎn)擊進(jìn)入網(wǎng)址搜索自己所需的依賴(構(gòu)建)如:servlet、jsp、test(Junit) 等.....:點(diǎn)擊進(jìn)入
這下面的是我常用的一些依賴
<!--依賴第三方配置-->
<dependencies>
<!-- 依賴 junit,jar包 便于test測(cè)試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- 依賴 servlet,jar包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- 依賴 jsp,jar包 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!--添加依賴Lombok 自動(dòng)生成JavaBean 所需的 tos,hashCode等-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
<!-- 依賴jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 依賴 mysql,jar包 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<!--依賴gson jar包 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
</dependencies>
<!--忽略test測(cè)試 -->
<!-- <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build> -->
什么是插件
插件是Maven的一個(gè)擴(kuò)展機(jī)制,它可以擴(kuò)展Maven的功能,例如編譯、測(cè)試、打包和部署等。
什么是倉(cāng)庫(kù)
倉(cāng)庫(kù)是Maven的一個(gè)重要概念,它是存儲(chǔ)依賴庫(kù)和插件庫(kù)的地方,包括本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)。
概述
Maven 是 Apache 軟件基金會(huì)組織維護(hù)的一款專門為 Java 項(xiàng)目提供構(gòu)建和依賴管理支持的工具。Maven是基于項(xiàng)目對(duì)象模型(POM),可以通過(guò)一小段描述信息來(lái)管理項(xiàng)目的構(gòu)件,報(bào)告和文檔的軟件項(xiàng)目管理工具。
1、構(gòu)建
Maven是一個(gè)優(yōu)秀的構(gòu)建工具。 它能夠幫我們自動(dòng)化構(gòu)建過(guò)程,從清理、編譯、測(cè)試到生成報(bào)告,再到打包和部署。我們不需要也不應(yīng)該一遍又一遍地輸入命令,一次又一次地點(diǎn)擊鼠標(biāo),我們要做的是使用Maven配置好項(xiàng)目,然后輸入簡(jiǎn)單的命令(如:mvn clean install),Maven會(huì)幫我們處理那些煩瑣的任務(wù)。
Java 項(xiàng)目開發(fā)過(guò)程中,構(gòu)建指的是使用原材料生產(chǎn)產(chǎn)品的過(guò)程。
- 原材料
- Java 源代碼
- 基于 HTML 的 Thymeleaf 文件
- 圖片
- 配置文件
- 產(chǎn)品
- 一個(gè)可以在服務(wù)器上運(yùn)行的項(xiàng)目
- 構(gòu)建過(guò)程包含的主要的環(huán)節(jié):
- 清理:刪除上一次構(gòu)建的結(jié)果,為下一次構(gòu)建做好準(zhǔn)備
- 編譯:Java 源程序編譯成 *.class 字節(jié)碼文件
- 測(cè)試:運(yùn)行提前準(zhǔn)備好的測(cè)試程序
- 報(bào)告:針對(duì)剛才測(cè)試的結(jié)果生成一個(gè)全面的信息
- 打包
- Java工程:jar包
- Web工程:war包
- 安裝:把一個(gè) Maven 工程經(jīng)過(guò)打包操作生成的 jar 包或 war 包存入 Maven 倉(cāng)庫(kù)
- 部署
- 部署 jar 包:把一個(gè) jar 包部署到 Nexus 私服服務(wù)器上
- 部署 war 包:借助相關(guān) Maven 插件(例如 cargo),將 war 包部署到 Tomcat 服務(wù)器上
-
脫離IDE環(huán)境構(gòu)建項(xiàng)目
?
2、依賴
Maven還是一個(gè)依賴管理工具和項(xiàng)目信息管理工具。它提供了中央倉(cāng)庫(kù),能幫我們自動(dòng)下載構(gòu)件。
如果 A 工程里面用到了 B 工程的類、接口、配置文件等等這樣的資源,那么我們就可以說(shuō) A 依賴 B。例如:
- ?junit-4.12 依賴 hamcrest-core-1.3
- thymeleaf-3.0.12.RELEASE 依賴 ognl-3.1.26
- ognl-3.1.26 依賴 javassist-3.20.0-GA
- thymeleaf-3.0.12.RELEASE 依賴 attoparser-2.0.5.RELEASE
- thymeleaf-3.0.12.RELEASE 依賴 unbescape-1.1.6.RELEASE
- thymeleaf-3.0.12.RELEASE 依賴 slf4j-api-1.7.26
依賴管理中要解決的具體問(wèn)題:
- jar 包的下載:使用 Maven 之后,jar 包會(huì)從規(guī)范的遠(yuǎn)程倉(cāng)庫(kù)下載到本地
- jar 包之間的依賴:通過(guò)依賴的傳遞性自動(dòng)完成
- jar 包之間的沖突:通過(guò)對(duì)依賴的配置進(jìn)行調(diào)整,讓某些jar包不會(huì)被導(dǎo)入
安裝與配置
1、下載
下載Maven地址:點(diǎn)擊進(jìn)入
?2、Windows Maven安裝
1)解壓到指定目錄
注意:
- Maven依賴于Java,因此必須保證已經(jīng)安裝JDK,并配置好環(huán)境變量
- 路徑不要存在中文或空格
2)配置環(huán)境變量
注意:
- MAVEN_HOME或M2_HOME:指定Maven根目錄
- Path:指定Maven相關(guān)的命令程序所在的bin目錄
- MAVEN_HOME:D:\java\Maven\apache-maven-3.9.1-bin\apache-maven-3.9.1
- Path:%MAVEN_HOME%\bin
我以前配置過(guò)的,我就不重新配置了,那么我把配置步驟給大家展示出來(lái)!大家跟著步驟配置,就不會(huì)有什么問(wèn)題的!
?
配置好之后試一下
$ mvn -v
測(cè)試通過(guò)如圖
2.1) 注意如果是Linux或Mac系統(tǒng)
要編輯用戶目錄下的.bash_profile文件
# 編輯用戶目錄下的.bash_profile文件
# 編輯用戶目錄下的.bash_profile文件 $ vim .bash_profile ########### Maven1.0 Evn ################## # export MAVEN_HOME=/Users/circleus/apache-maven-3.5.4 # export MAVEN_HOME=/Users/circleus/aliyun-maven-3.6.0 # export PATH=$MAVEN_HOME/bin:$PATH ########### Maven2.0 Evn ################## # export M2_HOME=/Users/circleus/aliyun-maven-3.6.0 # export M2_HOME=/Users/circleus/apache-maven-3.5.4 # export PATH=$PATH:$M2_HOME/bin ########### Maven3.0 Evn ################## # export PATH=/Users/circleus/aliyun-maven-3.6.0/bin:$PATH
3)目錄結(jié)構(gòu)
- bin目錄:包含mvn的運(yùn)行腳本
- boot目錄:包含一個(gè)類加載器的框架,maven使用它加載自己的類庫(kù)
- conf目錄:存放配置文件的目錄(核心配置文件settings.xml文件)
- lib目錄:包含maven運(yùn)行時(shí)的依賴類庫(kù)
3、配置
1.根目錄創(chuàng)建一個(gè)文件夾
路徑:D:\java\Maven\apache-maven-3.9.1-bin
創(chuàng)建:LocalAddress 文件夾
首先自己創(chuàng)建一個(gè)文件夾如:創(chuàng)建一個(gè)LocalAddress 文件夾
文件夾的命名是隨意的,建議命名有意義的??!
2.settings.xml文件配置
路徑:D:\java\Maven\apache-maven-3.9.1-bin\apache-maven-3.9.1\conf
配置:settings.xml文件
配置本地倉(cāng)庫(kù)
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository> D:\java\Maven\apache-maven-3.9.1-bin\LocalAddress</localRepository>
看圖:
3.settings.xml文件配置鏡像倉(cāng)庫(kù)
<!--阿里云Maven鏡像配置-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun.</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
?注意:打開settings.xml,Ctrl+F搜索?http://0.0.0.0/ 跳到 mirrors
<mirrors>
??????? 在這里面配置阿里云鏡像
</mirrors>
安裝與配置差不多已經(jīng)完成了,最后一步就是把settings.xml文件復(fù)制粘貼到LocalAddress 文件夾中
注意: 由于我以前配置好了,所以里面才存放了那么多文件,剛剛配置的時(shí)候是沒(méi)有那么多的
常用命令
查看maven版本
mvn -v?
編譯
mvn compile
打包
mvn package
測(cè)試
mvn test
清除target
mvn clean
安裝jar包到本地倉(cāng)庫(kù)中
mvn install
創(chuàng)建Maven項(xiàng)目
1、手工創(chuàng)建
1)Maven項(xiàng)目目錄結(jié)構(gòu)
- 項(xiàng)目名稱
- src:項(xiàng)目源碼
- main:存放主程序
- java:存放Java源碼
- 包名+類名
- resoures:存放資源文件
- webapp:web資源
- java:存放Java源碼
- test:存放測(cè)試程序
- java:存放Java測(cè)試源碼
- 包名+類名
- resources:存放資源文件
- java:存放Java測(cè)試源碼
- main:存放主程序
- target:此目錄由maven生成
- pom.xml:Maven項(xiàng)目核心配置文件
- src:項(xiàng)目源碼
2)pom.xml配置文件
在Maven中,<packaging>元素可以指定不同的打包類型。除了"jar"之外,常見的打包類型還包括:
- JAR(Java Archive):用于打包Java類文件和相關(guān)資源。
- WAR(Web Application Archive):用于打包Java Web應(yīng)用程序,包含Java類文件、Web資源和部署描述符。
- EAR(Enterprise Application Archive):用于打包企業(yè)級(jí)Java應(yīng)用程序,包含WAR文件和其他組件(如EJB模塊)以及部署描述符。
- POM(Project Object Model):用于聚合多個(gè)子項(xiàng)目的父項(xiàng)目,本身不會(huì)生成任何實(shí)際的構(gòu)建產(chǎn)物。
除了這些常見的打包類型,Maven還支持其他特殊的打包類型,如RAR(Resource Adapter Archive)和BUNDLE(OSGi Bundle)等,用于特定的應(yīng)用場(chǎng)景??梢愿鶕?jù)具體需求選擇適當(dāng)?shù)拇虬愋蛠?lái)構(gòu)建項(xiàng)目。
封裝成jar包
<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>
<!-- 項(xiàng)目坐標(biāo):GAV jar 坐標(biāo)便于被別人使用,便于管理-->
<groupId>edu.nf</groupId><!--包名-->
<artifactId>demo</artifactId><!--項(xiàng)目名 模板-->
<version>1.0-SNAPSHOT</version><!--指定版本-->
<packaging>jar</packaging><!--封裝成jar包-->
<name>ums</name>
<url>http://maven.apache.org</url>
<!--配置相關(guān)的屬性-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--依賴第三方配置-->
<dependencies>
<!--添加依賴 junit構(gòu)件 方便測(cè)試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!--添加依賴 servlet-API 為什么要添加servlet依賴:因?yàn)檫\(yùn)行servlet需要用到j(luò)ar包,而這個(gè)servlet依賴可以幫助下載需要到的jar包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
封裝成war包
<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>
<!-- 項(xiàng)目坐標(biāo):GAV jar 坐標(biāo)便于被別人使用,便于管理-->
<groupId>edu.nf</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>ums</name>
<url>http://maven.apache.org</url>
<!--配置相關(guān)的屬性-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--依賴第三方配置-->
<dependencies>
<!--添加依賴 junit構(gòu)件 方便測(cè)試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!--添加依賴 servlet-API 為什么要添加servlet依賴:因?yàn)檫\(yùn)行servlet需要用到j(luò)ar包,而這個(gè)servlet依賴可以幫助下載需要到的jar包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
附上視頻
純手動(dòng)創(chuàng)建一個(gè)Maven項(xiàng)目
3)說(shuō)明
- 項(xiàng)目坐標(biāo)
- groupId:包名(公司或組件域名倒序).項(xiàng)目名
- artifactId:項(xiàng)目名-模塊名
- version:指定版本
- dependencies:依賴列表,指定本項(xiàng)目所依賴的第三方工具(構(gòu)件/jar)
- archetype插件——自動(dòng)創(chuàng)建符合maven規(guī)定的目錄骨架
- 方法一:mvn archetype:generate
- 第一次構(gòu)建需要連接網(wǎng)絡(luò),從官網(wǎng)下載相關(guān)的插件
- 可以配置國(guó)內(nèi)鏡像解決
JUnit
1、概念
JUnit是一個(gè)用于Java編程語(yǔ)言的測(cè)試框架,可以幫助開發(fā)人員編寫自動(dòng)化的單元測(cè)試和集成測(cè)試。
2、使用步驟
第一:在項(xiàng)目中添加JUnit依賴(在pom.xml配置Junit依賴)
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
第二:創(chuàng)建一個(gè)測(cè)試類,該類應(yīng)該包含一些測(cè)試方法。在測(cè)試類中使用@Test注解 來(lái)標(biāo)識(shí)測(cè)試方法。 在 java里 assertEquals這個(gè)的意思是表示比較實(shí)際值和期望值是否相等
package com.maven.demo ;
import org.junit.* ;
import org.junit.Assert.* ;
public class UserTest {
@Test
public void testHello() {
// 斷言驗(yàn)證測(cè)試結(jié)果是否符合預(yù)期
Assert.assertEquals("hello",new User().sayHello()) ;
}
}
第三:在測(cè)試方法中編寫測(cè)試代碼??梢允褂脭嘌詠?lái)驗(yàn)證測(cè)試結(jié)果是否符合預(yù)期。例如,使用assertEquals()方法來(lái)比較實(shí)際值和期望值。
第四:運(yùn)行測(cè)試??梢允褂肐DE工具來(lái)運(yùn)行測(cè)試,也可以使用Maven或Gradle等構(gòu)建工具來(lái)運(yùn)行測(cè)試。測(cè)試運(yùn)行后,將會(huì)顯示測(cè)試結(jié)果和測(cè)試覆蓋率等相關(guān)信息。
常用API
1)@Test注解
用于標(biāo)識(shí)一個(gè)測(cè)試方法。例如:
@Test
public void testAddition() {
int result = Calculator.add(2, 3);
assertEquals(5, result);
}
2)assertEquals()方法
用于比較實(shí)際值和期望值是否相等。例如:
int result = Calculator.add(2, 3);
assertEquals(5, result);
3)assertTrue()和assertFalse()方法
用于驗(yàn)證一個(gè)條件是否為真或?yàn)榧?。例如?/p>
boolean flag = Calculator.isPositive(5);
assertTrue(flag);
flag = Calculator.isPositive(-5);
assertFalse(flag);
4)assertNotNull()和assertNull()方法
用于驗(yàn)證對(duì)象是否為空或不為空。例如:
String str = Calculator.getString();
assertNotNull(str);
str = null;
assertNull(str);
5)@Before和@After注解
用于標(biāo)識(shí)測(cè)試方法之前和之后要執(zhí)行的方法。例如:
@Before
public void setUp() {
Stystem.out.println("我先測(cè)試的")
}
@After
public void tearDown() {
Stystem.out.println("我最后測(cè)試")
}
public void tes(){
System.out.println("測(cè)試中...")
}
6)@BeforeClass和@AfterClass注解
用于標(biāo)識(shí)所有測(cè)試方法之前和之后要執(zhí)行的方法。例如:
@BeforeClass
public static void setUpClass() {
// 初始化測(cè)試數(shù)據(jù)
}
@AfterClass
public static void tearDownClass() {
// 清理測(cè)試數(shù)據(jù)
}
@BeforeClass
public static void setUpClass() {
// 初始化測(cè)試數(shù)據(jù)
}
@AfterClass
public static void tearDownClass() {
// 清理測(cè)試數(shù)據(jù)
}
7)@Ignore注解
用于標(biāo)識(shí)某個(gè)測(cè)試方法需要被忽略。例如:
@Ignore("這個(gè)測(cè)試方法還沒(méi)準(zhǔn)備好")
@Test
public void testSomething() {
// 測(cè)試代碼
}
Lombok
依賴包
<!--添加依賴Lombok 自動(dòng)生成JavaBean 所需的 tos,hashCode等-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
Lombok是一個(gè)Java庫(kù),它可以通過(guò)注解自動(dòng)化Java類的樣板代碼,從而簡(jiǎn)化開發(fā)人員的編程任務(wù)。
1、@Data注解
使用@Data注解可以自動(dòng)生成JavaBean所需的getter、setter、toString、equals和hashCode方法。
@Data
public class Person {
private String name;
private int age;
}
2、@AllArgsConstructor和@NoArgsConstructor注解
使用@AllArgsConstructor和@NoArgsConstructor注解可以自動(dòng)生成有參構(gòu)造函數(shù)和無(wú)參構(gòu)造函數(shù)。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private int age;
}
3、@Builder注解
使用@Builder注解可以自動(dòng)生成Builder模式所需的代碼,可以方便地創(chuàng)建復(fù)雜對(duì)象。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-491197.html
@Data
@Builder
public class Person {
private String name;
private int age;
private String address;
}
Person person = Person.builder()
.name("張三")
.age(20)
.address("北京市")
.build();
總結(jié)
好了,費(fèi)了好大的勁,終于寫好了,希望多多支持,有什么不對(duì)的地方請(qǐng)多多指出!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-491197.html
到了這里,關(guān)于Maven項(xiàng)目管理-隨筆(入門)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!