IDEA+SpringBoot安装部署说明

一、Idea+Maven+SpringBoot安装部署说明

Maven      英[ˈmeɪvn]美[ˈmevən]

Apache Maven是一个软件项目管理和理解工具。基于项目对象模型(POM)的概念,Maven可以从一个中央信息管理项目的构建,报告和文档。

1.Maven安装

下载maven(http://maven.apache.org/download.cgi),解压,配置环境变量M2_HOME和PATH(命令mvn --version查看版本)

M2_HOME=E:\02-develop\08-maven\apache-maven-3.5.2

PATH=%PATH%;%M2_HOME%\bin

修改本地仓库地址:%M2_HOME%\conf\settings.xml增加

<localRepository>E:\02-develop\08-maven\repo</localRepository>

修改mirrors代替中央仓库,速度比较快:%M2_HOME%\conf\settings.xml增加

<mirror> 

           <id>nexus-aliyun</id> 

      <mirrorOf>central</mirrorOf>   

      <name>Nexus aliyun</name> 

      <url>http://maven.aliyun.com/nexus/content/groups/public</url>

</mirror>

概念:

2.IDEA配置Maven

file--settings--Build,Excution,Deployment--Build Tools--Maven

3.新建项目

file--new--project--Spring Initializr--Project SDK--next--Type Maven Project--next--Web--next-Finish

 

application.properties配置端口server.port=9090

编写Controller

4.编译+测试+打包

idea:install--Run Maven Build

命令:mvn install

5.部署

SpringBoot内置tomcat,用java命令启动

java -jar maven-springboot-test1-0.0.1-SNAPSHOT.jar

6.访问

http://localhost:9090/hi?name=小明

7.cargo-maven2-plugin插件自动部署

7.1 pom.xml添加插件

配置一下两个tomcat地址,fileName:生成的war包名称

<build>

   <finalName>app</finalName>

   <plugins>

      <plugin>

         <groupId>org.springframework.boot</groupId>

         <artifactId>spring-boot-maven-plugin</artifactId>

      </plugin>

      <plugin>

         <groupId>org.codehaus.cargo</groupId>

         <artifactId>cargo-maven2-plugin</artifactId>

         <configuration>

            <container>

               <containerId>tomcat9x</containerId>

               <home>E:\02-develop\09-tomcat\apache-tomcat-9.0.2</home>

            </container>

            <configuration>

               <type>existing</type>

               <home>E:\02-develop\09-tomcat\apache-tomcat-9.0.2</home>

            </configuration>

         </configuration>

         <executions>

            <execution>

               <id>cargo-run</id>

               <phase>install</phase>

               <goals>

                  <goal>run</goal>

               </goals>

            </execution>

         </executions>

      </plugin>

   </plugins>

</build>

7.2 配置war

7.3 新建类SpringBootStartApplication

public class SpringBootStartApplication extends SpringBootServletInitializer {



    @Override

    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {

        // 注意这里要指向原先用main方法执行的Application启动类

        return builder.sources(MavenSpringbootTest1Application.class);

    }

}

7.4 编辑+测试+打包

idea:install--Run Maven Build

命令:mvn install

7.5 访问

http://localhost:8080/app/hi?name=小明aaa

8.将启动关闭做成centos7服务

新建start.sh,stop.sh,restart.sh在这三个脚本中分别实现启动、关闭、重启功能,然后在/usr/lib/systemd/的system或者user目录下新建myapp.service(system下的服务不需要登录)

start.sh

stop.sh

restart.sh

myapp.service

测试:systemctl start myapp

  systemctl stop myapp

  systemctl restart myapp

设置开机启动:systemctl enable myapp

取消开机启动:systemctl disable myapp 

9.jenkins+gitlab部署

参考网址:http://blog.csdn.net/ruangong1203/article/details/73065410

9.1 安装gitlab

参考:https://about.gitlab.com/installation/#centos-7

9.1.1 安装并配置必要的依赖关系

sudo yum install -y curl policycoreutils-python openssh-server

sudo systemctl enable sshd

sudo systemctl start sshd

sudo firewall-cmd --permanent --add-service=http

sudo systemctl reload firewalld

sudo yum install postfix

sudo systemctl enable postfix

sudo systemctl start postfix

9.1.2 添加GitLab软件包库并安装软件包

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh|sudo bash

sudo EXTERNAL_URL="http://xxx.xxx.xxx:xx" yum install -y gitlab-ee

9.2 安装jenkins

参考:http://blog.csdn.net/myNameIssls/article/details/70209516

9.2.1安装Jenkins

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo

sudo rpm –import https://jenkins-ci.org/redhat/jenkins-ci.org.key

sudo yum install jenkins

9.2.2启动、关闭jenkins服务

sudo service jenkins start/stop/restart

9.2.3防火墙设置

firewall-cmd --zone=public --add-port=8080/tcp --permanent

firewall-cmd --zone=public --add-service=http --permanent

firewall-cmd --reload

在浏览器中输入http://ip:8080即可

9.3 安装git,gitlab插件

Git plugin可能已经默认安装

9.4 配置gitlab插件

9.4.1gitlab创建token

9.4.2jenkins添加Credentials

API token填写上图gitlab生成的token

9.4.3配置gitlab插件

Credentials选择9.4.2添加的,配置完成点击Test测试

9.5 配置git插件

 

9.6 创建jenkins job

9.7 生成gitlab的ssh秘钥

在jenkins服务器上生成秘钥

ssh-keygen -t rsa -C "root@<jenkins服务器ip>" -b 4096

全部默认

id_rsa是私钥,id_rsa_pub是公钥

公钥内容复制到key

9.8 配置job的源码管理

点击add,配置ssh私钥,将私钥内容复制到Private Key,不要勾选From a file on Jenkins master

9.9 配置SCM

配置定时构建任务,点击右侧问号图标查看格式

H/2 * * * *每两分钟执行一次构建(前提是项目有提交,没有提交不会触发)

 

10.jenkins+gitlab用webhook自动部署

10.1 jenkins安装Gitlab Hook Plugin、Build Aut插件

参考:http://www.cnblogs.com/ceshi2016/p/6529557.html

10.2 jenkins生成令牌

openssl rand -hex 10

10.3 jenkins 配置

10.4 gitlab配置

10.5 测试

10.6 查看刚刚自动部署

 

11.maven私服nexus安装配置

11.1 下载安装

https://www.sonatype.com/download-oss-sonatype

11.1.1 windos解压安装

环境变量添加bin到path

启动nexus /run

11.1.2 centos7安装参考:http://blog.csdn.net/yougoule/article/details/56843562

安装

tar -zxvf nexus-3.7.1-02-unix.tar.gz -C /usr/local/

cd /usr/local/nexus-3.7.1-02/bin/

./nexus run &

开机启动

ln -s /usr/local/nexus-3.7.1-02/bin/nexus /etc/init.d/nexus3

ln -s /usr/local/nexus-3.7.1-02/bin/nexus /etc/init.d/nexus3

ln -s /usr/local/nexus-3.7.1-02/bin/nexus /etc/init.d/nexus3

修改nexus3的运行用户为root

vim nexus.rc

run_as_user="root"

修改nexus3启动时要使用的jdk版本

vim nexus

INSTALL4J_JAVA_HOME_OVERRIDE=/usr/local/java/jdk1.8.0_144

修改nexus3默认端口(可选)

cd /usr/local/nexus-3.7.1-02/etc/

vim nexus-default.properties

application-port=8081

修改nexus3数据以及相关日志的存储位置(可选)

cd /usr/local/nexus-3.7.1-02/bin/

vim nexus.vmoptions

-XX:LogFile=./sonatype-work/nexus3/log/jvm.log -Dkaraf.data=./sonatype-work/nexus3 -Djava.io.tmpdir=./sonatype-work/nexus3/tmp

 

安装完成访问http://localhost:8081测试

右上角点击sign in,默认用户名/密码: admin/admin123

11.2 添加仓库

点击Create reponsitory

11.3 上传jar

配置maven/conf/settins.xml

<server>

   <id>3rdParty</id>

   <username>admin</username>   

   <password>admin123</password>   

</server>

执行下图命令(注意:-DrepositoryId=3rdParty必须和server的id一致)

mvn deploy:deploy-file -DgroupId=com.test -DartifactId=myjar -Dversion=1.0.2 -Dpackaging=jar -Dfile=E:\02-develop\03-workspace\springboot\build\libs\springboot-0.0.1-SNAPSHOT.jar -Durl=http://localhost:8081/repository/3rdParty/ -DrepositoryId=3rdParty

11.4 maven项目使用

<!--仓库地址-->

<repositories>

   <repository>

      <id>nexus</id>

      <name>Team Nexus Repository</name>

      <url>http://localhost:8081/repository/maven-public/</url>

   </repository>

</repositories>

<!-- 插件地址 -->

<pluginRepositories>

   <pluginRepository>

      <id>thirdparty</id>

      <name>Team Nexus Repository</name>

      <url>http://localhost:8081/repository/maven-public/</url>

   </pluginRepository>

</pluginRepositories>
<dependency>

   <groupId>com.test</groupId>

   <artifactId>myjar</artifactId>

   <version>1.0.2</version>

</dependency>

11.5 nexus私服依赖下载

11.5.1配置public仓库组

登录nexus,点击Views/Repositorys/Repositorys,选中Public Repositorys,点击Configuration        将Central,Snapshots,Releases移动到左边。

11.5.2配置Central

选中Central仓库,配置Remote Storage Locatio值为

http://maven.aliyun.com/nexus/content/groups/public/

Download Remote Indexes值设置为true,保存

点击Adminstation--Scheduled Tasks查看从阿里云下载情况

如果没有下载全,右键点击Central,Repaire Index、Update Index

11.5.3 配置settins.xml

参考http://blog.csdn.net/shenshen123jun/article/details/9084293

settins.xml在maven/conf目录下,在mirrors下配置如下:

<mirror>

  <id>public</id>

  <mirrorOf>*</mirrorOf>

  <name>Local Repository</name>

  <url>http://10.100.50.36:8081/nexus/content/repositories/public/</url>

</mirror>

url配置私服的仓库,mirrorOf的*表示所有依赖都从私服下载

12.Gitlab-ci自动部署

12.1安装Gitlab-Runner

参考:https://www.jianshu.com/p/df433633816b

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash

yum install gitlab-ci-multi-runner

12.2注册

gitlab-ci-multi-runner register

#引导会让你输入gitlab的url,输入自己的url,例如http://gitlab.example.com/

#引导会让你输入token,去相应的项目下找到token,例如ase12c235qazd32

#引导会让你输入tag,一个项目可能有多个runner,是根据tag来区别runner的,输入若干个就好了,比如web,hook,deploy

#引导会让你输入executor,这个是要用什么方式来执行脚本,图方便输入shell就好了。

12.3编写.gitlab-ci.yml

在项目根目录下编写.gitlab-ci.yml这样在push之后,gitlab-ci就会自动识别来解析了

stages:

  - deploy

deploy:

    stage: deploy

    script:

      - deploy Example_Group Example_Project

    only:

      - master

    tags:

      - myrunner

stages:阶段,任务

script:脚本,执行deploy脚本,后面两个是参数

only:只有master分支提交时才执行该stages

tags:runner名称

12.4编写deploy脚本

if [ $# -ne 2 ]

then

        echo "arguments error!"

        exit 1

else

        deploy_path="/var/www/$1/$2"

        if [ ! -d "$deploy_path" ];

        then

                project_path="git@10.100.50.52:"$1/$2".git"

                   it clone $project_path $deploy_path

        else

                cd $deploy_path+

                git pull

        fi

        

         cd $deploy_path

         mvn package

fi

给该脚本加权限:chmod +x deploy

给部署的目录加权限:chown -hR gitlab-runner:gitlab-runner /var/www

将该文件加到环境变量:PATH=xxx/deploy:$PATH

12.5配置ssh登录

在gitlab上注册和gitlab-runner同名的用户并给项目权限

su gitlab-runner(该服务器用户是安装Gitlab Runner后自动添加的)

在~/.ssh下执行ssh-keygen一直回车

cat ~/.ssh/id-rsa.pub将公钥内容复制到gitlab用户gitlab-runner的ssh Keys

13.Gitlab-ci+docker自动部署

13.1配置.gitlab-ci.yml

将.gitlab-ci.yml放在项目根路径下,内容如下:

image: docker:latest

 

# 两个阶段:mavenBuild-测试,imageBuild-生成iamges并上传

stages:

  - mavenBuild

  - imageBuild

 

maven-build:

    # image: hengle/centos7-jdk1.8-maven3.5.2

    stage: mavenBuild

    script:

      - "mvn test"

    only:

      - master

    tags:

      - mytest

 

image-build:

    stage: imageBuild

    script:

      - "current_date=$(date +%m%d%H%M)"

      - "commit_sha=$CI_COMMIT_SHA"

      - "mvn package -Dmaven.test.skip=true"

      - "docker build -t $DOCKER_REGISTRY_PRO:5000/spring-cloud-eureka:$CI_COMMIT_REF_NAME-$current_date-${commit_sha:0:8} ."

      - "docker login -u $DOCKER_REGISTRY_USERNAME -p $DOCKER_REGISTRY_PASSWORD $DOCKER_REGISTRY_PRO:5000"

      - "docker push $DOCKER_REGISTRY_PRO:5000/spring-cloud-eureka:$CI_COMMIT_REF_NAME-$current_date-${commit_sha:0:8}"

    only:

      - master

    tags:

      - mytest

13.2配置变量

在项目的Settings-CI/CD-Secret variables添加.gitlab-ci.yml中用到的部分变量

13.3配置Dockerfile

在跟路径下配置Dockerfile

FROM hengle/centos7-jdk1.8:v1

VOLUME /tmp

VOLUME /data

ADD ./target/*.jar /app.jar

RUN sh -c 'touch /app.jar'

ENV JAVA_OPTS=""

ENV JAVA_HOME=/opt/jdk/jdk1.8.0_161

ENV CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV PATH=$PATH:$JAVA_HOME/bin

ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Duser.timezone=Asia/Shanghai -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

13.4私有仓库搭建并且配置仓库认证

参考:https://www.jianshu.com/p/7918c9af45a3

docker pull registry

mkdir -p /docker-hub/auth

docker run --entrypoint htpasswd registry -Bbn testuser testpassword > auth/htpasswd

docker run -d -p 5000:5000 --restart=always --name docker-hub \

  -v /docker-hub/registry:/var/lib/registry \

  -v /docker-hub/auth:/auth \

  -e "REGISTRY_AUTH=htpasswd" \

  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \

  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \

  registry

查看私库上的镜像

http://10.100.50.60:5000/v2/_catalog

查看某个镜像的标签

http://10.100.50.60:5000/v2/spring-cloud-eureka/tags/list

13.5配置docker私库地址

修改/etc/sysconfig/docker文件,并重新启动docker服务

OPTIONS='--selinux-enabled --insecure-registry 10.100.50.60:5000'

13.6总结

服务器:gitlab服务器、ci服务器、docker私库服务器

代码提交给gitlab服务器,gitlab服务器发现项目配置了ci,将根目录下的.gitlab-ci.yml发送给ci服务器执行,ci服务器执行mavenBuild测试和imageBuild生成镜像,并将镜像上传到docker私库。

二、gradle构建springboot项目(IDEA工具)

1.gradle下载配置

1.1 使用IDEA工具也可以不用手动配置gradle,在构建项目的时候选择gradle wrapper这一

项就不用自己配置本地的gradle(如下图所示)

1.2 本地的gradle需要自己下载和配置,gradle官方网址

https://gradle.org/gradle-download/

1.3 下载后,无需安装,解压即可。然后配置一下系统环境,打开控制台输入gradle -v,出现如下所示就表示安装成功

2.gradle构建soringboot(IDEA工具)

2.1 打开IDEA新建项目选择spring initializr,选择本地jdk版本 然后下一步

2.2 Artifac项目名,Type选择gradle project 然后点击下一步

2.3 点击web选择web,然后sql选择mysql mybatis,点击下一步

2.4 勾选use auto-import,如果本地没有安装gradle选择gradle wrapper,本地安装了gradle选择Use local gradle distribution点击ok。

2.5 此时的项目结构是这样的

说明:src为源码路径,开发主要在src下

src/main/java下放java文件

src/main/resources下放配置文件

src/test/java下放test测试案例

build.gradle文件:gradle配置文件

 

2.6 创建一个 Controller 类(在 main 文件夹下),如图所示

2.7 修改 build.gradle 文件,默认生成的 Gradle 文件并不能满足编译 Spring Boot 应用,需要手动修改

 

2.8 application.properties:项目配置文件添加数据库的配置

3.测试

启动项目,通过浏览器访问该项目,该项目因为配置的路径为根路径,所以直接访问localhost:8080即可,此时gradle构建springboot项目成功

4.项目打包成jar

这里有两种方式:使用IDEA工具打包(不推荐),gradle打包

4.1 Idea打包jar

首先按F4或者点击IDEA右上角这地方

进入项目结构管理器

选择这里面的Artifacts。开始我完全不知道Artifacts是什么东西,后来查阅了点资料:Artifacts是maven中的一个概念,表示某个module要如何打包,例如war exploded、war、jar、ear等等这种打包形式;意思我理解的就是Artifacts就是告诉我们的程序因该如何打包这个项目。

之后新建一个Artifacts

这有两个选项选择第二个,从模块中引入,点击进去后会有一些设置,如下:

module是你需要打成jar包的项目

MainClass是运行的主函数,如果不需要运行则可以不选择

jar files from libraries是项目打包的方式,下面选项大致的含义:

1:extract to the target jar:把所有文件倒入进一个jar包里

2:copy to the。。。。:把项目的依赖包导出和项目一个目录,通过MANIFEST.MF文件来引用jar包。

这里如果你的项目需要打成一个可运行的jar包推荐第二种,反之第一种。

设置完之后,就会新建一个xxx:jar,并进入进入xxx:jar的编辑页面

在我们需要进行一个输出目录布局的设置,我们可以看到,已经编译好的项目的jar文件(我的是eachend.jar)和其他导入的jar包混到一起的,很杂,我是点击output layout下最左边的文件夹图标新建了一个lib文件,把其他jar包拖拽进来(建议,也可以直接点OK完成)

但是我们这样做的话依赖的jar包的目录就会产生变化,这时候我们需要选中我们项目,在下方然后修改MANIFEST.MF中的Class Path  

修改成

OK

到了这一步后Artifacts是写好了,保存之后就可以用来生成jar文件

点击build Artifacts后选择你刚刚生成的artifacts

build后就会在out的目录下生成对应的jar文件

最后进入项目目录 输入命令java -jar XXX.jar  就可以跑起来了  如下

 

4.2 gradle打包jar

        利用gradle进行打包其实非常非常简单,但是因为我平常只是简单用它来导包,以及构建项目,它的基本的一些东西不是很清楚,所以走了些弯路花了大半天的时间才搞出来,所以说有时候需要了解一下你所用的东西的一些基础和原理。

        在build,gradle中首先需要加上

apply plugin: 'java'

apply plugin: 'idea'

来定义你自己项目使用的插件,apply plugin: 'idea'用于把项目构建成idea项目,apply plugin: 'java'用于添加Java插件,以及一些内置任务,打包jar就要用到这里的插件。

 

version = '1.0'

repositories {

    mavenCentral()

}

这里用来声明版本号以及添加maven中心仓库地址

dependencies {

       compile 。。。。。。。

}

这里来添加项目所需要的依赖包

jar {

    String someString = ''

    configurations.runtime.each {someString = someString + " lib\\"+it.name} //遍历项目的所有依赖的jar包赋值给变量someString

    manifest {

        attributes 'Main-Class': 'com.each.dubboMainEnd'

        attributes 'Class-Path': someString

    }

}

打包的时候,这个地方很重要,用来设置jar文件的相关属性,这个地方把我坑了有点久,最后补了下gradle的基础知识,就搞出来了,这篇博客写gradle基础写的还可以,推荐给大家看看http://www.open-open.com/lib/view/open1447139848053.html

首先这定义了一个someString用来存放依赖包的信息,通过configurations.runtime拿到所有的运行时的依赖jar包,然后.each遍历他,通过it.name获取到每个的jar包的name,赋值。

manifest即是编译完成后生成jar包中的MANIFEST.MF配置信息

task copyJar(type:Copy){

    from configurations.runtime

    into ('build/libs/lib')

 

}

task release(type: Copy,dependsOn: [build,copyJar]) {//    from  'conf'

 //   into ('build/libs/eachend/conf')

}

建立函数copyJar 用于把依赖的jar复制到对应的目录下。

函数release即是我们打包的时候的执行的函数,dependsOn[build,copyJar]这里会让执行relese函数的时候先执行build(系统自带的函数) 和copyJar

最后通过gradle release命令进行打包

打包成功!

目录如下:

cmd下进入对应目录运行 java -jar XXX.jar

运行成功!

build.gradle 完整源码:

apply plugin: 'java'

 

apply plugin: 'idea'

 

 

 

version = '1.0'

repositories {

    mavenCentral()

}project.ext {

    springVersion = '4.0.4.RELEASE'

    minaVersion = '2.0.13'

}dependencies {

    compile('com.alibaba:dubbo:2.4.9') {

        exclude group: 'org.springframework', module: 'spring'

    }

    compile( "org.apache.zookeeper:zookeeper:3.3.6") {

        exclude group: 'javax.jms', module: 'jms'

        exclude group: 'com.sun.jmx', module: 'jmxri'

        exclude group: 'com.sun.jdmk', module: 'jmxtools'

    }

    compile( "com.github.sgroschupf:zkclient:0.1") {

        exclude group: 'javax.jms', module: 'jms'

        exclude group: 'com.sun.jmx', module: 'jmxri'

        exclude group: 'com.sun.jdmk', module: 'jmxtools'

    }

    compile "org.springframework:spring-webmvc:$springVersion",

            "org.springframework:spring-web:$springVersion",

            "org.springframework:spring-tx:$springVersion",

            "org.springframework:spring-orm:$springVersion",

            "org.springframework:spring-jdbc:$springVersion",

            "org.springframework:spring-expression:$springVersion",

            "org.springframework:spring-core:$springVersion",

            "org.springframework:spring-context:$springVersion",

            "org.springframework:spring-beans:$springVersion",

            "org.springframework:spring-aop:$springVersion",

            "org.apache.mina:mina-http:$minaVersion",

            "org.apache.mina:mina-core:$minaVersion",

            "org.hibernate.common:hibernate-commons-annotations:4.0.1.Final",

            "org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final",

            "org.hibernate:hibernate-core:4.1.0.Final",

            "com.alibaba:fastjson:1.1.33.android",

            "com.google.code.gson:gson:2.2.4",

            "org.jboss.netty:netty:3.2.5.Final",

            "mysql:mysql-connector-java:5.1.10",//            "org.apache.zookeeper:zookeeper:3.3.6",//            "com.github.sgroschupf:zkclient:0.1",

            "cn.jpush.api:jpush-client:3.2.9",

            "redis.clients:jedis:2.6.1",

            "javax.servlet:javax.servlet-api:3.1.0",

            "net.sf.ezmorph:ezmorph:1.0.4",

            "com.google.collections:google-collections:1.0",

            "org.json:json:20090211",

            "net.sf.json-lib:json-lib:2.2.1:jdk15",

            fileTree(dir: 'lib', include: '*.jar')

}

 

jar {

    String someString = ''

    configurations.runtime.each {someString = someString + " lib\\"+it.name}

    manifest {

        attributes 'Main-Class': 'com.each.dubboMainEnd'

        attributes 'Class-Path': someString

    }

}

//清除上次的编译过的文件task clearPj(type:Delete){

    delete 'build','target'

}

task copyJar(type:Copy){

    from configurations.runtime

    into ('build/libs/lib')

 

}

//把JAR复制到目标目录task release(type: Copy,dependsOn: [build,copyJar]) {//    from  'conf'//    into ('build/libs/eachend/conf') // 目标位置

}

5.部署

SpringBoot内置tomcat,用java命令启动

java -jar maven-springboot-test1-0.0.1-SNAPSHOT.jar

 

  • 13
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值