【Maven】2.使用Nexus3搭建Maven私服+上傳第三方jar包到本地maven倉庫
參考文章:
http://www.cnblogs.com/luotaoyeah/p/3791966.html
------------------------------------------------------------------------------------------------------------------------------------------------------------------
參考文章介紹的非常詳盡,自己寫下來這個,只是以做筆記的形式走一走自己的歷程,人笨,還是記下來的好。
=====================================================================================================
1.搭建Maven私服背景
公司還是按捺不住,要搭建一個自己的Maven本地倉庫,可以讓開發人員down架包,從內網還是快很多。
這樣公司的maven本地倉庫就是 開發人員自己電腦上的maven倉庫 和 Maven遠端倉庫 之間的一個緩衝倉庫。
那要構建一個maven私服,需要用到Maven倉庫管理軟體,關於Apache Archiva,Artifactory,Sonatype Nexus的區別,有下面這些的參考對比:
http://blog.sina.com.cn/s/blog_72ef7bea0102vq0k.html
http://www.sonatype.org/nexus/2015/02/23/migrating-from-artifactory-archiva-or-a-raw-maven-repository-to-sonatype-nexus/
2.安裝Nexus,並初次啟動Nexus
這裡我們下載開源版 Nexus OSS。Nexus 提供兩種安裝包,一種是包含 Jetty 容器的 bundle 包,另一種是不包含容器的 war 包。下載地址:http://www.sonatype.org/nexus/go。
這裡先以windows上為例【Linux上之後再來一份】
在你點選下載之後,會有Read THE BOOK 的入口和加入NENUX社群的入口。
這裡直接給你ReadTheBook的地址:https://help.sonatype.com/display/NXRM3
這裡你可以找到官方提供的完整安裝和使用教程。【因為這裡使用的是Nexus3的版本,和參考文章中不大一致】
下載的壓縮包解壓下來
然後cmd,命令視窗進入nexus-3.5.2-01目錄下的bin目錄下,按照官方的啟動方式,需要在bin目錄下使用nexus /run命令啟動,如下圖
確認之後,下面會打印出來啟動的相關資訊,接下來,耐心等待它啟動完成。
直到出現下面這個,才算啟動完成。
初次啟動之後,你可以在瀏覽器上訪問nexus這個maven管理器
地址:http://localhost:8081/
當然,你可以使用預設的使用者登入。
使用者名稱:admin
密碼:admin123
此時,觀看命令視窗,會有記錄相關的操作記錄。
3.將nexus配置為系統服務
根據官方文件說明,將nexus配置為系統服務是一個很好的選擇。因為
第一:上面的安裝和啟動過程並沒有預設的把nexus作為服務加入系統服務中;
第二:這樣下次伺服器重啟,服務也會重啟。
但是這個有個前提,就是已經確保安裝了Java執行時環境。
接下來,我們重新開啟一個視窗,去將nexus加入系統服務
最後的<optional-service-name>,咱們直接命名成nexus就好。【當然,最後這個不指定的話,預設就是建立成nexus服務名】
在windows7上安裝nexus為系統服務時,報錯:could not open SCManager
但是報錯如下:
解決方法:
然後再次執行
如果再解決不了,那就在
直接以管理員身份執行這個命令提示符,然後安裝服務。
顯示安裝成功之後,可以進入控制面板---》管理工具---》服務
查詢名為nexus的服務
你可以選擇,點選上面的啟動按鈕啟動服務,也可以用下面的命令啟動服務
【當然,可以在上面配置啟動引數,這個之後再去檢視配置】
啟動完成之後,試著訪問一下http://localhost:8081/
因為上面服務是自動的。
重啟電腦之後,再次訪問,可以訪問到,完美。
4.配置nexus和熟悉它
第一步,跟隨著說明文件,看看下載nexus下來之後,有兩個目錄
nexus-3.5.2-01 安裝目錄
bin 包含nexus的啟動指令碼和相關配置
etc jetty、karaf等配置檔案
jre jre環境
lib java架包庫
public 關於nexus應用在本地跑起來所需要的資源
system 應用所有的外掛和元件
sonatype-work\nexus3 資料文件
blobs/ 建立blob的預設路徑,如果你指定了絕對路徑,那就不在這裡了
cache/ 當前快取的karaf包的資訊
db/ OrientDB資料庫的資料,用於儲存nexus的元資料的資料庫
elasticsearch / 當前配置的Elasticsearch狀態
etc/ 大概是執行時配置狀態和關於資源庫的自定義的相關的東西
health-check/ 看目錄,健康檢查的相關報告的儲存目錄吧
keystores/ 自動生成的關於資源庫的ID主鍵
log/ 執行例項生成的日誌檔案,也有日誌檔案的壓縮包,貌似是每天都會生成日誌檔案,你可以定期刪除老的日誌檔案
tmp/ 用於儲存臨時檔案的目錄
具體每個目錄下的各個配置檔案的作用,請參考官方文件說明:https://help.sonatype.com/display/NXRM3/Installation
如果你想配置nexus的應用在本地啟動的JVM引數,可以在nexus.vmoptions
如果你想改變nexus的埠號,可以在nexus-default.properties
5.搭建maven私服資源庫
由於現在使用的nexus3,所以在nexus應用上資源庫初始化目錄和nexus2有很大的不同,但是型別都是一樣的。
第一步:首先http://localhost:8081/
登入上nexus,未登入的狀態下是這樣的。
使用預設使用者名稱admin密碼admin123登入後,如下
第二步:使用nexus3要搭建maven私服的核心功能
在nexus安裝並啟動之後,我大概的把整個nexus的官方說明文件走了一遍,主要就是介紹了左側選單中的各個功能模組。https://help.sonatype.com/display/NXRM3/Configuration
有興趣去看看,還是很有幫助的。
====================================================================================================================
-------------------------------------------------------------------------------------普及-----------------------------------------------------------------------------------------------------------------
上面提到的一點,不管nexus版本是怎麼樣的,至少,repository的型別是一樣的。
先看一下大概的目錄結構:
根據多方的文件和別人的部落格,再綜合官網的解釋,我就這樣理解得出:
資源庫也就是這麼三種,如上圖中 【代理資源庫】【託管資源庫】【組資源庫】,其實名字就是我自己瞎起的。
具體解釋一下:
【代理資源庫】:就是配置了外網的maven遠端倉庫地址的資源庫,本地找不到,就會通過代理資源庫中的地址,找到遠端倉庫,從遠端倉庫中下載所需要的jar。
【託管資源庫】:就是放在本地的資源庫,零零散散的jar,從遠端倉庫中下不到,只能自己在網上找,找到jar下載下來,放在託管資源庫中,交給nexus統一管理。不然哪天想去用連線資料庫的jar包,還得自己翻磁碟,多麻煩。
【組資源庫】 :從上面①+②看出來,其實組資源庫中並沒有jar包,而是把代理資源庫和託管資源庫統一配置到組資源庫中,然後組資源庫作為一個唯一的public提供給所有人使用。就像工人1+工人2把自己的賬單統一給包工頭,讓包工頭去跟老闆結賬是一個道理。
好,明確了這一點,開始往下看吧。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果你想直入主題,往下看。
①在建立 repository之前,還是需要先設定一個指定的檔案儲存目錄,便於統一管理。
由下面新建的完成的,可以看出,
②第二步,建立Proxy Repository 代理資源庫
建立頁面出來之後,頁面上有三個input框是必填的:
遠端Maven地址:https://repo1.maven.org/maven2/
其他的不用更改了。儲存就好了。
【注意】:我想建好幾個proxy repository,以便於我可以加入更多的遠端maven倉庫到我的group 資源庫中
唯一一點,就是你看你加入的proxy資源庫哪個使用的是國內的maven倉庫地址,哪個是國外的。
當然國內的要放在國外的之前。
這樣的加入group資源庫的順序就是 hosted資源庫>國內proxy資源庫>國外proxy資源庫
下面給出一些maven遠端倉庫的地址:
jboss的maven中央倉庫地址:http://repository.jboss.com/maven2/
阿里雲的maven中央倉庫地址:http://maven.aliyun.com/nexus/content/groups/public/
apache的maven中央倉庫地址:http://repo.maven.apache.org/maven2/
③第三步,建立hosted repository 託管資源庫
Hosted有三種方式,Releases、SNAPSHOT、Mixed
Releases: 一般是已經發布的Jar包
Snapshot: 未釋出的版本
Mixed:混合的
④第四步,建立group repository 組資源庫
為什麼要注意順序??
官方文件中建議:
It is recommended practice to place hosted repositories higher in the list than proxy repositories. For proxy repositories, the repository manager needs to check the remote repository which will incur more overhead than a hosted repository lookup.
希望將hosted repositories【託管資源庫】的順序放在proxy repositories【代理資源庫】之前,因為一個group【組資源庫】中可以涵括這些託管資源庫和代理資源庫。而一整個的group是作為一個public,一個介面給別人使用的。所以當查詢架包的時候,如果代理資源庫在前面,那就是先從遠端去查詢jar,而不是先從託管資源庫(本地倉庫)去查詢是否有jar。這樣訪問外網的消耗比起來在本地查詢,當然是將託管資源庫放在代理資源庫之前的優先位置了。
⑤第五步,比較nexus中預設提供的
好吧,從命名上也可以看出來,系統自帶的命名可以看出來這個資源庫是什麼型別中的什麼型別的。【沒有建立未釋出的資源庫,那以後咱們自己想去建立的,自行建立,再加入到group中就行了】
如果你想,可以自己去建立一個新的admin,新的使用者名稱,新的密碼,新的許可權。供下面使用。
6.讓maven專案用到剛剛搭建的maven私服
==========================================================個人理解===============================================================
maven下的setting.xml檔案和你自己專案中的pom.xml檔案的關係:
Ⅰ.settting.xml檔案就是本地,電腦上的全域性變數;而pom.xml檔案就是區域性變數。
Ⅱ.自己建立的pom.xml檔案肯定對於專案來說,優先使用的。然而pom.xml檔案中如果沒有指定jar要從哪裡下載的話,也就是說沒有配置映象地址的話,當然只能去按照全域性變數中定義的地址去找了
Ⅲ.那怎麼去找咱們的全域性變數呢?其他人可能是直接在pom.xml檔案中配置指定的方式。我是使用的IDE【編譯工具】中直接指定確定的setting.xml檔案,這樣在pom.xml檔案中沒有的情況下,我的IDE就按照設定的去找對應的setting.xml檔案去。
【注意】:有一點要注意的就是,maven如果是你自己下載的,那裡面肯定會有一份setting.xml檔案。什麼都不配置的話,它全部都是按照預設值去幹的,例如本地倉庫它預設的就是放在使用者/.m2/資料夾下的。
【忠告】:在修改setting.xml檔案之前,先備份一份原始的。個人感覺裡面的註釋是非常有參考價值的。
下面開始解釋具體的詳細步驟:
最簡單的使用方式:
①在原始的setting檔案中加入
拷貝的這個地址,就是下面即將在setting.xml檔案中新增時使用的。可以對應下面的setting.xml檔案中看。
<!--http://www.cnblogs.com/sxdcgaq8080/p/7580964.html 有詳細教程--> <!--就是配置maven本地倉庫的地址為自定義的地址--> <localRepository>D:\apps\repository</localRepository> <!--nexus伺服器--> <servers> <server> <id>nexus</id> <username>admin</username> <password>admin123</password> </server> </servers> <!--組資源庫的url地址 id和name自定義,mirrorOf的值設定為central,寫死的--> <mirrors> <mirror> <id>nexus</id> <name>nexus repository</name> <url>http://localhost:8081/repository/myself_group/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
②按照http://www.cnblogs.com/sxdcgaq8080/p/7580964.html教程,把IDE指定為這個setting.xml檔案即可。
③在新建的maven專案中的pom.xml檔案中,新增一個原本本地倉庫中沒有下載過的架包【新建maven專案的過程:http://www.cnblogs.com/sxdcgaq8080/p/5586644.html】
你自己的專案中pom.xml檔案並不需要改變什麼東西,以前怎麼用,現在還怎麼用。
例如下面:
這是我新建的一個maven專案
pom.xml檔案中
<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.testP</groupId> <artifactId>mavenProject</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <build> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <version>3.1</version> </configuration> </plugin> </plugins> </build> <!-- 這一段是新新增的,這一段之外的都是建立maven專案時,它自己生成的pom.xml檔案框架 --> <dependencies> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> <scope>provided</scope> </dependency> </dependencies> <!-- 這一段結束 --> </project>
然後儲存pom.xml檔案之後,
在本地倉庫中
這個就算你不建私服,只要指定了本地倉庫自定義的地址,一般都會下載成功的。
下面看看私服中是否有這個東西
http://localhost:8081/ admin、admin123登入進入[不登陸也可以搜尋,這看你自己會給遊客這種角色分配什麼樣的許可權了]
點開檢視:
點進入jar包的這個概要資訊
查詢發現,後面的那一串應該類似於UUID的字串 可以查詢到
原來nexus把下載下來的所有檔案都轉化成了byte檔案。這也難怪在上面建立
是使用的blob這個單詞。二進位制的意思吧!!!
=========================================================================================================================================
至此,maven私服搭建,以及使用maven專案使用maven私服已經全部連通。
如果想看詳細的配置的話,可以在GitHub上檢視:https://github.com/sonatype/nexus-book-examples
=========================================================================================================================================
7.使用命令上傳第三方jar到nexus
最後的最後,就是還有一部分,咱們沒有走。
使用nexus2的話,可以在介面上直接上傳第三方的jar到上建立的hosted資源庫,也就是託管資源庫中。
可是nexus3在頁面我愣是找了半天也沒有找到。同時官方的說明文件我查了一半,貌似也沒有發現。所以,頁面上既然沒有這個功能,就只能自己使用命令上傳第三方jar到nexus了。
示例:
上傳一個處理word的jar包到nexus上。
jar包為jacob
我們先在nexus上搜索一下:下面是搜不出來的
步驟1:
把hosted資源庫,也配置到maven的settting.xml檔案中
新增下面:
<!--id自定義,但是在使用命令上傳的時候會用到-->
<server> <id>myself_hosted</id> <username>admin</username> <password>admin123</password> </server>
到目前為止,我的settting.xml檔案也就是下面這些東西
步驟2:
使用
以下命令
mvn deploy:deploy-file -DgroupId=sxd.jar -DartifactId=jacob -Dversion=1.18 -Dpackaging=jar -Dfile=G:\jar\jacob-1.18.jar -Durl=http://localhost:8081/repository/myself_hosted/ -DrepositoryId=myself_hosted
命令解釋:
-DgroupId=sxd.jar 自定義
-DartifactId=jacob 自定義
-Dversion=1.18 自定義 三個自定義,構成pom.xml檔案中的座標
-Dpackaging=jar 上傳的型別是jar型別
-Dfile=G:\jar\jacob-1.18.jar jar的本地磁碟位置
-Durl=http://localhost:8081/repository/myself_hosted/ hosted資源庫的地址,下圖中
-DrepositoryId=myself_hosted setting.xml檔案中配置的ID
上傳完成,再nexus中檢視一下:
上傳成功!!!
步驟3:
在專案的pom.xml檔案中引入一下jar包
<dependency> <groupId>sxd.jar</groupId> <artifactId>jacob</artifactId> <version>1.18</version> <scope>provided</scope> </dependency>
儲存pom.xml檔案。
這下,發現maven下已經引入成功。並且已經將這個jar包放入本地maven倉庫了。
完全成功了。
==========================================================================================================================================================
這個整個的過程,花費了一個週末+2天的時間!
==========================================================================================================================================================
附贈:如果上面的方法失敗,可以使用這個方法上傳已經存在的第三方jar包到本地maven倉庫
例如我的本地有幾個第三方的jar,你想直接上傳本地的maven倉庫
1.有幾個第三方的jar
2.編輯上傳命令install
匯入第三方jar的命令
mvn install:install-file -Dfile=D:\document\IdeaProjects\myTestDocument\jar\transaction-springcloud-4.2.0-SNAPSHOT.jar -DgroupId=com.codingapi -DartifactId=transaction-springcloud -Dversion=4.2.0-SNAPSHOT -Dpackaging=jar
匯入第三方pom檔案的命令【留作參考】
mvn install:install-file -Dfile=D:\document\IdeaProjects\myTestDocument\jar\tx-lcn-4.2.0-SNAPSHOT.pom -DgroupId=com.codingapi -DartifactId=tx-lcn -Dversion=4.2.0-SNAPSHOT -Dpackaging=pom
3.上傳完成後,可以將source的jar直接拷貝到maven倉庫中
本地maven倉庫中展示已經上傳成功的jar目錄
將source 直接拷貝到此處即可【如果沒有source就算了】
4.最後,就可以在自己的專案中引用了
<dependency> <groupId>com.codingapi</groupId> <artifactId>transaction-springcloud</artifactId> <version>4.2.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.codingapi</groupId> <artifactId>tx-plugins-db</artifactId> <version>4.2.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
即可!!!!!
相關推薦
【Maven】2.使用Nexus3搭建Maven私服+上傳第三方jar包到本地maven倉庫
參考文章: http://www.cnblogs.com/luotaoyeah/p/3791966.html ----------------------------------------------------------------------------------------------------
如何上傳第三方jar包至Maven私服讓maven專案可以使用第三方jar包
一、場景 由於要使用第三方jar包。而第三方給的demo是java專案而不是maven專案,所以無法直接把jar包複製在build path add到maven中使用,因為如果是直接 build path到專案中。雖然maven專案本地可以使用不報錯,但是打包時會報錯,無法
maven私服nexus上傳第三方jar包以及下載
私服是一個特殊的遠端倉庫,它是架設在區域網內的倉庫服務。私服代理廣域網上的遠端倉庫,供區域網內的Maven使用者使用。當Maven需要下載構建的使用,它先從私服請求,如果私服上沒有的話,則從外部的遠端倉庫下載,然後快取在私服上,再為Maven的下載請
nexus3.3.1上傳第三方jar包
Maven構件上傳工具,可上傳jar到本地庫和自己搭建的nexus庫,點選下載 安裝當前最新版本的nexus,安裝教程網上搜,不多說了。 因為nexus3x版本沒有2x版本中內建的3rd_part,所以不能在介面中上傳jar包,必須使用maven的命令列。
Docker安裝Nexus搭建Maven私服、部署引用jar包
docker run --restart="always" -d -p 8081:8081 --name nexus -v /opt/data/nexus-data:/nexus-data sonatype/nexus3 注意點:若出現許可權問題 chmod 777 nexus-
Maven入門:使用Nexus搭建Maven私服及上傳下載jar包 Maven入門:使用Nexus搭建Maven私服及上傳下載jar包
Maven入門:使用Nexus搭建Maven私服及上傳下載jar包 一. 私服搭建及配置 1 . 私服簡介 私服是架設在區域網的一種特殊的遠端倉庫,目的是代理遠端倉庫及部署第三方構件。有了私服之後,當 Maven 需要下載構件時,直接請求私服,私服上存在則下載到本地倉庫;
Maven入門:使用Nexus搭建Maven私服及上傳下載jar包
一. 私服搭建及配置 1 . 私服簡介 私服是架設在區域網的一種特殊的遠端倉庫,目的是代理遠端倉庫及部署第三方構件。有了私服之後,當 Maven 需要下載構件時,直接請求私服,私服上存在則下載到本地倉庫;否則,私服請求外部的遠端倉庫,將構件下載到私服,再提供給本地
maven 利用docker容易搭建nexes私服
伺服器:ubuntu-16.04 1、 更新資源: $ sudo apt-get update 更新 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的地址,這樣才能獲取到最新的軟體包 2、安裝docker
【SpringBoot】2.快速搭建一個SpringBoot應用
上一篇部落格我們介紹了SpringBoot的概念,這裡我們通過快速搭建一個SpringBoot應用來體驗SpringBoot的特色。 1.建立工程 首先我們開啟MyEclipse,建立一個Maven工程: 然後選擇建立模式,這裡我們選擇不需要骨架: 最後填寫專案相關引數:
【FTP】大文件的打包分割上傳
ftp 文件分割 實驗環境 虛擬環境:Exsi6.0系統:Redhat7tar相關:第2章 新手必須掌握的Linux命令。split相關:Linux系統下使用split命令分割大文件ftp相關: 一、打包壓縮文件 # -c 創建壓縮文件;-x解壓;-z Gzip格式;-v 顯示過程(後臺腳本模式不要用
【封裝】使用okHttp傳送網路請求及上傳下載進度監聽
參考資料: 如何正確地寫出單例模式 http://wuchong.me/blog/2014/08/28/how-to-correctly-write-singleton-pattern 設計模式總結篇系列:單例模式(SingleTon) htt
【128】Spring Boot 1 實現瀏覽器拍照上傳功能
最近寫了個DEMO,實現瀏覽器拍照並上傳圖片的功能。框架用了Spring Boot 1.5.17.RELEASE,Java版本是8 。我把程式碼傳到了碼雲上,專案地址:https://gitee.com/zhangchao19890805/csdnBlog Gi
【前端】利用ajax實現偽檔案非同步上傳下載
利用ajax可以實現很酷的效果,在不重新整理頁面的情況下提交表單、修改資料狀態等等,可是如果表單裡還有input:file可就慘了,ajax不支援檔案的處理啊! ajax是使用了瀏覽器內部的XmlHttpRequest物件來傳輸XML資料的。既然是Xml的資料傳輸,那麼傳輸
【前端】js+php實現圖片拖拽上傳
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>拖拽圖片上傳</title> </head> <body>
如何向Maven倉庫中上傳第三方jar包
路徑和 username pos .com 安裝路徑 找到 依賴 com 刷新 本文詳細介紹如何向maven倉庫中上傳第三方jar包。 1、在本地maven安裝路徑中找到conf文件夾下面的setting.xml文件,裏面有訪問maven倉庫的路徑和賬號、密碼;
Android 打包上傳AAR檔案到本地Maven倉庫並且引用
1.前言 建議電腦端觀看,多圖慎入 平常專案中遇到的一些公共元件,公共模組,多個專案都在使用的情況下,我們一般有以下幾種做法 1.整個module匯入工程,如果module中有什麼bug,修改了還要其他專案再重新新增進去,很不方便 2.module打包A
Java-Maven專案引入UEditor圖片上傳元件jar包類庫的5種方式
專案用Maven管理jar包,用到了UEditor的jar包。專案原來直接使用UEditor的原始碼,編譯部署後,正常。 後來用的是jar包,放到WEB-INF目錄的lib包下,預設情況下,Maven不會把lib包加入到Classpath中,需要手動加入。 線上Maven
【H5】手機瀏覽器分批次多張上傳圖片(檔案),包含進度條
描述 本文所描述的上傳檔案主要是應用於手機端,PC端可以酌情改造。 應用場景: 手機瀏覽器一次上傳多張圖片或者檔案,將檔案每5個拆分為一組上傳。上傳進度條為手機端上傳至後臺所用時間不包含後臺耗時。 選擇圖片用H5的input file標籤(能否選多張看瀏覽器了),上傳功能使
springboot專案引入第三方jar包(maven倉庫沒有)打包專案時編譯失敗
大神完美解決我問題!!! 如下: 昨晚釋出了一個Kotlin + Springboot 的 Demo 專案,其他都沒問題了,在打包這裡出問題了。一直打不進去本地包到 Springboot 的jar 中。找了幾種方式,都不是很好使,最終今天在公司有同事提醒先把
【OSS】檔案(實際就是Object)上傳下載操作
package com.ls; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream;