首页 文章 精选 留言 我的

精选列表

搜索[GA4集成],共10000篇文章
优秀的个人博客,低调大师

Android 应用程序集成Google 登录及二次封装

谷歌登录API: https://developers.google.com/identity/sign-in/android/ 1、注册并且登录google网站 https://accounts.google.com/ 2、进入google开发者平台创建应用 https://developers.google.com/mobile/add?platform=android&cntapi=signin&cntapp=Default%20Demo%20App&cntpkg=com.google.samples.quickstart.signin&cnturl=https:%2F%2Fdevelopers.google.com%2Fidentity%2Fsign-in%2Fandroid%2Fstart%3Fconfigured%3Dtrue&cntlbl=Continue%20with%20Try%20Sign-In 3、在开发者平台填写响应的信息,包括 应用名、包名、签名的SHA-1值 图1 图2 图3 4、在项目中添加谷歌服务 4.1、在SDK Manager 里面下载 google service 4.2、在project目录下的build.gradle下添加 classpath 'com.google.gms:google-services:2.1.0-alpha4' 查看最新版本号:https://jcenter.bintray.com/com/google/gms/google-services/ 4.3 在model目录下的build.gradle下添加 compile 'com.google.android.gms:play-services-auth:8.4.0' 5、代码实现 5.1、在布局文件中 1 <com.google.android.gms.common.SignInButton 2 android:id="@+id/google_signIn_bt" 3 android:layout_width="wrap_content" 4 android:layout_height="wrap_content" /> 5 6 <Button 7 android:id="@+id/google_loginOut_bt" 8 android:layout_width="match_parent" 9 android:layout_height="wrap_content" 10 android:text="google退出登录" 11 android:layout_gravity="center" 12 android:gravity="center" 13 > 14 </Button> 5.2、java代码 1 package com.pegasus.map.presentation.ui.activity; 2 3 import android.content.Intent; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.widget.Button; 7 8 import com.google.android.gms.auth.api.Auth; 9 import com.google.android.gms.auth.api.signin.GoogleSignInAccount; 10 import com.google.android.gms.auth.api.signin.GoogleSignInOptions; 11 import com.google.android.gms.auth.api.signin.GoogleSignInResult; 12 import com.google.android.gms.common.ConnectionResult; 13 import com.google.android.gms.common.SignInButton; 14 import com.google.android.gms.common.api.GoogleApiClient; 15 import com.google.android.gms.common.api.ResultCallback; 16 import com.google.android.gms.common.api.Status; 17 import com.pegasus.map.R; 18 import com.pegasus.map.presentation.ui.base.BaseActivity; 19 20 import butterknife.Bind; 21 import butterknife.ButterKnife; 22 23 /** 24 * Created by ${zyj} on 2016/3/24. 25 * 登录 26 */ 27 28 public class LoginActivity1 extends BaseActivity implements GoogleApiClient.OnConnectionFailedListener , View.OnClickListener { 29 30 public int RequestCode = 10 ; 31 32 @Bind( R.id.google_signIn_bt ) 33 public SignInButton google_signIn_bt ; 34 35 @Bind( R.id.google_loginOut_bt ) 36 public Button google_loginOut_bt ; 37 38 public GoogleSignInOptions gso ; 39 public GoogleApiClient mGoogleApiClient ; 40 41 @Override 42 protected void onCreate(Bundle savedInstanceState) { 43 super.onCreate(savedInstanceState); 44 setContentView(R.layout.activity_login); 45 ButterKnife.bind(this); 46 init(); 47 } 48 49 50 private void init() { 51 //初始化谷歌登录服务 52 gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 53 .requestEmail() //获取邮箱 54 .requestId() //获取id 号 55 .requestIdToken("456212545785") //获取token 56 .build(); 57 58 // Build a GoogleApiClient with access to GoogleSignIn.API and the options above. 59 mGoogleApiClient = new GoogleApiClient.Builder( this ) 60 .enableAutoManage( this , this ) 61 .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 62 .build(); 63 64 //登录 65 google_signIn_bt.setSize(SignInButton.SIZE_STANDARD); 66 google_signIn_bt.setScopes(gso.getScopeArray()); 67 google_signIn_bt.setOnClickListener(this) ; 68 69 //退出 70 google_loginOut_bt.setOnClickListener(this) ; 71 72 } 73 74 @Override 75 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 76 super.onActivityResult(requestCode, resultCode, data); 77 78 //谷歌登录成功回调 79 if ( requestCode == RequestCode ) { 80 GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 81 handleSignInResult( result ) ; 82 } 83 } 84 85 @Override 86 public void onConnectionFailed(ConnectionResult connectionResult) { 87 88 } 89 90 @Override 91 public void onClick(View v) { 92 switch ( v.getId() ){ 93 case R.id.google_signIn_bt : //登录 94 signIn(); 95 break; 96 97 case R.id.google_loginOut_bt : 98 signOut(); 99 break; 100 } 101 } 102 103 /** 104 * 登录 105 */ 106 private void signIn() { 107 Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 108 startActivityForResult(signInIntent, RequestCode ); 109 } 110 111 /** 112 * 退出 113 */ 114 private void signOut() { 115 Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( 116 new ResultCallback<Status>() { 117 @Override 118 public void onResult(Status status) { 119 // ... 120 } 121 }); 122 } 123 124 private void handleSignInResult(GoogleSignInResult result) { 125 if (result.isSuccess()) { 126 // Signed in successfully, show authenticated UI. 127 GoogleSignInAccount acct = result.getSignInAccount(); 128 //获取用户名 129 String name = acct.getDisplayName() ; 130 String email = acct.getEmail() ; 131 String token = acct.getIdToken() ; 132 String id = acct.getId() ; 133 134 } else { 135 // Signed out, show unauthenticated UI. 136 } 137 } 138 139 } 6、Google SDK 二次封装 1 package com.pegasus.map.presentation.utils; 2 3 import android.content.Intent; 4 import android.support.v4.app.FragmentActivity; 5 import android.util.Log; 6 import android.widget.Toast; 7 8 import com.google.android.gms.auth.api.Auth; 9 import com.google.android.gms.auth.api.signin.GoogleSignInAccount; 10 import com.google.android.gms.auth.api.signin.GoogleSignInOptions; 11 import com.google.android.gms.auth.api.signin.GoogleSignInResult; 12 import com.google.android.gms.common.api.GoogleApiClient; 13 import com.google.android.gms.common.api.ResultCallback; 14 import com.google.android.gms.common.api.Status; 15 import com.pegasus.map.R; 16 17 /** 18 * Created by ${zyj} on 2016/3/30. 19 */ 20 public class GoogleLogin { 21 22 public int requestCode = 10 ; 23 private FragmentActivity activity ; 24 public GoogleSignInOptions gso ; 25 public GoogleApiClient mGoogleApiClient ; 26 public GoogleApiClient.OnConnectionFailedListener listener ; 27 private GoogleSignListener googleSignListener ; 28 29 public GoogleLogin(FragmentActivity activity , GoogleApiClient.OnConnectionFailedListener listener ){ 30 this.activity = activity ; 31 this.listener = listener ; 32 33 //初始化谷歌登录服务 34 gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 35 .requestEmail() 36 .requestId() 37 .requestIdToken( activity.getString(R.string.google_server_client_id)) 38 .requestProfile() 39 .build(); 40 41 // Build a GoogleApiClient with access to GoogleSignIn.API and the options above. 42 mGoogleApiClient = new GoogleApiClient.Builder( activity ) 43 .enableAutoManage( activity , listener ) 44 .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 45 .build(); 46 } 47 48 49 /** 50 * 登录 51 */ 52 public void signIn() { 53 Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 54 activity.startActivityForResult(signInIntent, requestCode); 55 } 56 57 /** 58 * 退出登录 59 */ 60 public void signOut() { 61 Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( 62 new ResultCallback<Status>() { 63 @Override 64 public void onResult(Status status) { 65 if ( status.isSuccess() ){ 66 if ( googleSignListener != null ){ 67 googleSignListener.googleLogoutSuccess(); 68 } 69 }else { 70 if ( googleSignListener!= null ){ 71 googleSignListener.googleLogoutFail(); 72 } 73 } 74 } 75 }); 76 } 77 78 public String handleSignInResult(GoogleSignInResult result) { 79 String res = "" ; 80 if (result.isSuccess()) { 81 //登录成功 82 GoogleSignInAccount acct = result.getSignInAccount(); 83 res = "登录成功" 84 + "用户名为:" + acct.getDisplayName() 85 + " 邮箱为:" + acct.getEmail() 86 + " token为:" + acct.getIdToken() 87 + " 头像地址为:" + acct.getPhotoUrl() 88 + " Id为:" + acct.getId() 89 + " GrantedScopes为:" + acct.getGrantedScopes() ; 90 Log.e("res", "res:"+res); 91 Toast.makeText( activity, res, Toast.LENGTH_SHORT).show(); 92 if ( googleSignListener != null ){ 93 googleSignListener.googleLoginSuccess(); 94 } 95 } else { 96 // Signed out, show unauthenticated UI. 97 res = "-1" ; //-1代表用户退出登录了 , 可以自定义 98 Toast.makeText( activity , "退出登录", Toast.LENGTH_SHORT).show(); 99 if ( googleSignListener != null ){ 100 googleSignListener.googleLoginFail(); 101 } 102 } 103 return res ; 104 } 105 106 107 public void setGoogleSignListener( GoogleSignListener googleSignListener ){ 108 this.googleSignListener = googleSignListener ; 109 } 110 111 public interface GoogleSignListener { 112 void googleLoginSuccess(); 113 void googleLoginFail() ; 114 void googleLogoutSuccess(); 115 void googleLogoutFail() ; 116 } 117 118 } 注意:当你把 GoogleLogin 类复制到你项目中的时候,activity.getString(R.string.google_server_client_id) 这一句会报错,可以先不用管,在6.5 部分会做说明 6.1 在activity里使用封装类 activity 实现 GoogleApiClient.OnConnectionFailedListener , GoogleLogin.GoogleSignListener 两个接口 6.2 //初始化谷歌登录服务 GoogleLogin googleLogin = new GoogleLogin( this , this ) ; googleLogin.setGoogleSignListener(this); 6.3 1 @Override 2 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 3 super.onActivityResult(requestCode, resultCode, data); 4 5 //谷歌登录成功回调 6 if (requestCode == googleLogin.requestCode ) { 7 GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 8 googleLogin.handleSignInResult( result ) ; 9 } 10 } 6.4 1 //登录 2 googleLogin.signIn(); 3 4 //退出 5 googleLogin.signOut(); 6.5 获取google_server_client_id , 并在strings 里面配置 https://console.developers.google.com/projectselector/apis/credentials 在上面的网站里选择 点击选择项目,然后选择你创建的app,进入下面一个界面,得到对应的Client ID 补充:(2016/8/9) 有很多人留言或者发私信说一直登陆失败。然后我就自己写了一个demo,核心代码完全复制博客里面的GoogleLogin (代码见第六个标题,6、Google SDK 二次封装) 里面的代码,真的是一行代码都没有改,完完全全复制的。最后实现登陆成功,可见博客里面的代码是没有问题的。我在操作过程中,有几个关键的地方提一下。 1、权限问题 只需要添加联网权限即可 <uses-permission android:name="android.permission.INTERNET"></uses-permission> 2、签名问题 在开发者后台创建app的时候,需要添加 SHA-1的值,这个值是从你的签名里面获取的。注意,在你运行demo的时候,如果直接运行是不行的,因为直接运行,android studio 会为你的app使用默认签名,这个签名是系统自带的,这个签名的SHA-1值肯定和你真正的签名文件SHA-1值不一样,所以必然会登录失败。 你需要修改你的app debug 时的签名和 发布时的签名一直就好了。

优秀的个人博客,低调大师

weex sdk集成到Android工程三. weex服务项目搭建

1. 前言 前面介绍了app本地调用js的方式(js文件放在assert目录下面),其实大部分都是调用远程js,本篇介绍app如何调用远程js文件。 2.服务项目搭建步骤 前提需要安装好weex环境,具体参见前面文章:环境搭建地址 接下来讲解如何使用weex-toolkit构建项目: 1)创建项目: 命令行到任意文件夹,输入如下指令 weex init 1 1 执行指令后,会看到如图所示的信息: 此时你会在你的文件夹下面看到如下所示的目录结构: 2)安装npm依赖 命令行下面继续输入如下指令 // 安装依赖包,安装成功后,会增加一个node_modules包 npm install 1 2 1 2 3)启动serve 我们首先看一下package.json下的指令 "build": "webpack",// build 配置 "dev": "webpack --watch",// webpack 监听,可以自动监听修改 "serve": "serve -p 8080",// 启动服务 "test": "echo \"Error: no test specified\" && exit 1" 1 2 3 4 1 2 3 4 执行,如下指令: npm run build 1 1 npm run serve 1 1 成功后,日志如下图所示 我们在浏览器中输入localhost:8080查看效果吧。 很明显,在浏览器中正确展示了,但是最终要在手机中展现。 3.app中远程调用该js 调用代码改成如下所示 mWXSDKInstance.renderByUrl("MyApplication","http://10.25.52.72:8080/dist/main.js",null, null, -1, -1, WXRenderStrategy.APPEND_ASYNC); 1 1 运行app程序,界面如下图所示: 接下来就是要体验动态改变的功能了,很简单,改变服务项目中的.we文件 执行如下指令: npm run build 1 1 npm run serve 1 1 成功后,在打开app,你会发现如图所示: 是不是很强,类似动态部署。

优秀的个人博客,低调大师

Jenkins 持续集成平台构建之通过git提交代码

一、概述 上一篇文章介绍了Jenkins结合svn来构建jar包,本文介绍另一种代码提交的方式git,并结合maven来构建代码包。 实验环境: IP:10.0.90.27系统:Centos6.6x86_64 软件包: Jenkins2.9 Tomcat8.0.36 JDK8.92 maven3.3.9 git 二、安装步骤 1、安装jdk #rpm-ivhjdk-8u92-linux-x64.rpm Preparing...###########################################[100%] 1:jdk1.8.0_92###########################################[100%] UnpackingJARfiles... tools.jar... plugin.jar... javaws.jar... deploy.jar... rt.jar... jsse.jar... charsets.jar... localedata.jar... 2、安装tomcat #tarxfapache-tomcat-8.0.36.tar.gz-C/usr/local/ #cd/usr/local/ #ln-svapache-tomcat-8.0.36tomcat 启动 #cdtomcat #./bin/startup.sh UsingCATALINA_BASE:/usr/local/tomcat UsingCATALINA_HOME:/usr/local/tomcat UsingCATALINA_TMPDIR:/usr/local/tomcat/temp UsingJRE_HOME:/usr UsingCLASSPATH:/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Tomcatstarted. 访问测试: 在浏览器输入http://10.0.90.27:8080,出现tomcat的默认网页,表示安装成功。 3、安装Jenkins(安装方式是直接解压到tomcat中) 将jenkins.war包拷贝的/usr/local/tomcat/webapps目录 然后再浏览器访问: http://10.0.90.27:8080/jenkins/ 显示下面界面 根据提示从/root/.jenkins/secrets/initialAdminPassword文件中获取密码,然后继续,会看到如下界面: 然后就按照默认的选择(Install suggested plugins),继续下一步,会看到安装Plugin的界面: 安装Plugin的过程会花费一些时间,请耐心等待…… PS:如果一直处于安装状态(可能会因为网络原因,有些个Plugin安装不了),可以刷新一下浏览器,如果刷新之后提示你安装失败,你可以点击提示的“Retry”,继续。安装好Plugin之后,会让你创建一个admin用户,你可以自定义如下图: 也可以继续使用admin用户,如下红方框中的按钮(我这里是创建了一个普通的admin用户liguang): 创建好之后,点击“Save and Finish”按钮,会弹出如下页面: 然后点击 “Start using Jenkins”,就会看到安装好的Jenkins界面了 可以查看之前安装了哪些插件,哪些安装成功了,哪些没有安装成功,方法:“系统管理”--“管理插件”,会看到插件的界面,可以根据情况操作。 注意:假如你想使用svn来管理代码,但是svn插件没有安装,就会在创建的新项目进行配置的时候,“代码管理”设置部分显示为None,如下: 这个时候,你就需要安装svn插件了。 4、Jenkins安装插件 “系统管理”--“管理插件”--“可选插件”,然后在右上角的“过滤”长方框中输入svn,就会看到很多svn相关的插件,选择安装如下的插件即可: 选择“直接安装”或者“下载待重启后安装”都可以,我这里选择第二个,然后会看到如下界面,先是处于“等待”的状态,过一会儿就是“安装中”的状态。 安装好之后,提示如下图: 然后重新启动tomcat,刷新浏览器,再到“插件管理”查看svn的安装情况,如下表示安装成功: PS:这时,在到test_app项目中的“源码管理”部分,就会看到“None”和“Subversion”都存在了!但是很多时候我们也会用到CVS或者git来拉取代码,所以需要安装这2个插件。安装CVS(CVS Plug-in)和git(Git plugin)插件,方法一样,需要重启tomcat生效,安装完成之后,在项目配置的时候,就可以看到了,如下: 这样就有4种方式进行源码的管理了! 5、查看Jenkins的Global Tool Configuration “系统管理”---“Global Tool Configuration”,如下图: 根据提示可以看出是Jenkins服务器没有安装git,找不到git命令,后面会介绍安装git的方式。 三、配置Jenkins通过git拉取代码 注:gitlab的安装配置这里不介绍了(如果和Jenkins安装到同一台服务器,需要注意端口不要冲突了)1、在Jenkins服务器生成key #ssh-keygen-trsa##不需要设置密码,一路回车即可 Generatingpublic/privatersakeypair. Enterfileinwhichtosavethekey(/root/.ssh/id_rsa): Enterpassphrase(emptyfornopassphrase): Entersamepassphraseagain: Youridentificationhasbeensavedin/root/.ssh/id_rsa. Yourpublickeyhasbeensavedin/root/.ssh/id_rsa.pub. Thekeyfingerprintis: 5a:f1:2f:5c:78:26:26:0d:a4:43:e7:bf:c8:a0:91:e9root@localhost.localdomain Thekey'srandomartp_w_picpathis: +--[RSA2048]----+ |.o| |.=| |o+| |o.*.| |+.SB+| |.o==B| |E.o+.| |.| || +-----------------+ 2、在Jenkins服务器安装git客户端命令,我这里直接yum安装 #yuminstallgit-y 查看版本: #git--version gitversion1.7.1 安装好之后,再到Global Tool Configuration查看,就不会有二.5提示的错误了。顺便为其设置一个名称,Name 设置为git1.7.1 ,Path to Git executable 保持不变即可。 3、查看gitlab上Project的信息(我这里用的是之前搭建好的gitlab,地址是10.0.18.173),这里以server1/CSS项目为例: 红方框中给出的是访问该代码的方式,我们用的是git,所以需要配置为git@10.0.18.173:server1/css.git,也可以是域名:git@git.test111.com:server1/css.git 4、在Jenkins的项目中配置,以test_app为例子, 不过配置好之后,遇到了如下的问题: 原因:根据错误提示,发现是没有权限到gitlab服务器端拉取代码,需要将Jenkins服务端刚才生成的id_rsa.pub配置在某一个可以登录gitlab用户的SSH Keys 中,方法如下: 使用一个用户登录到gitlab,并且这个用户对gitlab上的所有项目有读写权限,然后添加Jenkins的key 点击右上方的“Profile settings”,在弹出的页面再点击“SSH Keys”,会弹出如下界面: 点击“Add SSH Key”,自定义Title,将key粘贴到下面的方框中,点击“Add key”,如下图: 然后刷新Jenkins页面,上面三.4出错的页面,就不会再报错了! PS:如果安装好Jenkins之后,你配置了普通用户并且设置了邮箱,添加好key之后,系统会发邮件通知你,内容如下: 5、为项目添加代码分支 首先要从gitlab上查看代码分支,然后在Jenkins的每个项目中添加分支,以test_app项目为例子,如下: 、 添加好之后要apply和save! PS:每次构建只能配置一个分支! 6、其他配置: 可以配置丢弃旧的构建,因为保留太多没有用。 四、配置Jenkins通过maven打包代码 1、安装maven插件,名称为:Maven Integration plugin,如下: 然后点击“直接安装”,需要等一些时间才能安装完成,然后重启tomcat生效! PS:安装的时候遇到一个问题,安装3次都不成功,提示失败,如下图: 然后ping域名updates.jenkins-ci.org是不通的,然后换用浏览器访问http://ftp.yz.yamagata-u.ac.jp/pub/misc/jenkins/plugins/maven-plugin/2.13/是可以访问的,然后我反复尝试了5-6次,最后安装成功了,无解!!! 2、在Jenkins上安装maven #tarxfapache-maven-3.3.9-bin.tar.gz-C/usr/local/ #cd/usr/local/ #ln-svapache-maven-3.3.9/maven `maven'->`apache-maven-3.3.9/' 设置环境变量 #vi/etc/profile#在末尾添加 ##maven MAVEN_HOME=/usr/local/maven exportMAVEN_HOME exportPATH=${PATH}:${MAVEN_HOME}/bin 执行source,使设置生效 #source/etc/profile 查看安装maven的信息 #mvn-v ApacheMaven3.3.9(bb52d8502b132ec0a5a3f4c09453c07478323dc5;2015-11-11T00:41:47+08:00) Mavenhome:/usr/local/maven Javaversion:1.8.0_92,vendor:OracleCorporation Javahome:/usr/java/jdk1.8.0_92/jre Defaultlocale:en_US,platformencoding:UTF-8 OSname:"linux",version:"2.6.32-504.el6.x86_64",arch:"amd64",family:"unix" 在Jenkins的web界面配置Maven版本和路径,选择“系统管理”--“Global Tool Configuration”,配置为如下: 然后“Apply”--“Save” 3、使用Maven创建项目 无论是学习语言还是框架,先来一个Hello World基本上已经是套路了,这里也通过构建一个Hello World项目来了解如何使用Maven。 a、首先通过maven创建helloworld项目 #mvnarchetype:create-DgroupId=helloworld-DartifactId=helloworld [INFO]Scanningforprojects... Downloading:https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom Downloaded:https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom(4KBat0.2KB/sec) Downloading:https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/22/maven-plugins-22.pom Downloaded:https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/22/maven-plugins-22.pom(13KBat2.0KB/sec) Downloading:https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/21/maven-parent-21.pom Downloaded:https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/21/maven-parent-21.pom(26KBat6.1KB/sec) Downloading:https://repo.maven.apache.org/maven2/org/apache/apache/10/apache-10.pom Downloaded:https://repo.maven.apache.org/maven2/org/apache/apache/10/apache-10.pom(15KBat6.7KB/sec) Downloading:https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.jar Downloaded:https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.jar(25KBat6.5KB/sec) ………………##省略 Downloaded:https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-archetype-plugin/2.4/maven-archetype-plugin-2.4.jar(92KBat2.3KB/sec) [INFO] [INFO]------------------------------------------------------------------------ [INFO]BuildingMavenStubProject(NoPOM)1 [INFO]------------------------------------------------------------------------ [INFO] [INFO]---maven-archetype-plugin:2.4:create(default-cli)@standalone-pom--- Downloading: ………………##省略 Downloaded:https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy/1.8.3/groovy-1.8.3.jar(5394KBat7.3KB/sec) [INFO]------------------------------------------------------------------------ [INFO]BUILDFAILURE [INFO]------------------------------------------------------------------------ [INFO]Totaltime:27:02min [INFO]Finishedat:2016-06-21T19:04:30+08:00 [INFO]FinalMemory:12M/30M [INFO]------------------------------------------------------------------------ [ERROR]Failedtoexecutegoalorg.apache.maven.plugins:maven-archetype-plugin:2.4:create(default-cli)onprojectstandalone-pom:Unabletoparseconfigurationofmojoorg.apache.maven.plugins:maven-archetype-plugin:2.4:createforparameter#:Cannotcreateinstanceofinterfaceorg.apache.maven.artifact.repository.ArtifactRepository:org.apache.maven.artifact.repository.ArtifactRepository.<init>()->[Help1] [ERROR] [ERROR]Toseethefullstacktraceoftheerrors,re-runMavenwiththe-eswitch. [ERROR]Re-runMavenusingthe-Xswitchtoenablefulldebuglogging. [ERROR] [ERROR]Formoreinformationabouttheerrorsandpossiblesolutions,pleasereadthefollowingarticles: [ERROR][Help1]http://cwiki.apache.org/confluence/display/MAVEN/PluginConfigurationException 可以看到,是有ERROR出现,google寻找原因,说法不一,然后尝试了如下方式: 原因:archetype:create命令已经过期,需要使用archetype:generate来进行代替 #mvnarchetype:generate-DgroupId=helloworld-DartifactId=helloworld [INFO]Scanningforprojects... [INFO] [INFO]------------------------------------------------------------------------ [INFO]BuildingMavenStubProject(NoPOM)1 [INFO]------------------------------------------------------------------------ [INFO] [INFO]>>>maven-archetype-plugin:2.4:generate(default-cli)>generate-sources@standalone-pom>>> [INFO] [INFO]<<<maven-archetype-plugin:2.4:generate(default-cli)<generate-sources@standalone-pom<<< [INFO] [INFO]---maven-archetype-plugin:2.4:generate(default-cli)@standalone-pom--- [INFO]GeneratingprojectinInteractivemode ………………##信息太多,省略 ……………… 1611:remote->uk.co.solong:angular-spring-archetype(SoLongarchetypeforRESTfulspringserviceswithanAngularJSfrontend.Includesdebiandeployment) 1612:remote->us.fatehi:schemacrawler-archetype-maven-project(-) 1613:remote->us.fatehi:schemacrawler-archetype-plugin-command(-) 1614:remote->us.fatehi:schemacrawler-archetype-plugin-dbconnector(-) 1615:remote->us.fatehi:schemacrawler-archetype-plugin-lint(-) Chooseanumberorapplyfilter(format:[groupId:]artifactId,casesensitivecontains):799:Chooseorg.apache.maven.archetypes:maven-archetype-quickstartversion: 1:1.0-alpha-1 2:1.0-alpha-2 3:1.0-alpha-3 4:1.0-alpha-4 5:1.0 6:1.1 Chooseanumber:6:Downloading:https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.1/maven-archetype-quickstart-1.1.jar Downloaded:https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.1/maven-archetype-quickstart-1.1.jar(7KBat3.7KB/sec) Downloading:https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.1/maven-archetype-quickstart-1.1.pom Downloaded:https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.1/maven-archetype-quickstart-1.1.pom(2KBat4.1KB/sec) [INFO]Usingproperty:groupId=helloworld [INFO]Usingproperty:artifactId=helloworld Definevalueforproperty'version':1.0-SNAPSHOT::##执行到此处停止了,回车即可 [INFO]Usingproperty:package=helloworld Confirmpropertiesconfiguration: groupId:helloworld artifactId:helloworld version:1.0-SNAPSHOT package:helloworld Y::##输入Y,回车 [INFO]---------------------------------------------------------------------------- [INFO]UsingfollowingparametersforcreatingprojectfromOld(1.x)Archetype:maven-archetype-quickstart:1.1 [INFO]---------------------------------------------------------------------------- [INFO]Parameter:basedir,Value:/root [INFO]Parameter:package,Value:helloworld [INFO]Parameter:groupId,Value:helloworld [INFO]Parameter:artifactId,Value:helloworld [INFO]Parameter:packageName,Value:helloworld [INFO]Parameter:version,Value:1.0-SNAPSHOT [INFO]projectcreatedfromOld(1.x)Archetypeindir:/root/helloworld [INFO]------------------------------------------------------------------------ [INFO]BUILDSUCCESS [INFO]------------------------------------------------------------------------ [INFO]Totaltime:11:33min [INFO]Finishedat:2016-06-22T10:03:37+08:00 [INFO]FinalMemory:14M/49M [INFO]------------------------------------------------------------------------ b、在当前目录查看helloworld项目生成的目录,如下: #treehelloworld/ helloworld/ ├──pom.xml └──src ├──main │└──java │└──helloworld │└──App.java └──test └──java └──helloworld └──AppTest.java 7directories,3file 其中src/main/java是源码目录,src/test/java是测试文件目录,到这些目录可以看到App.java中已经写好了一个Hello World程序,而AppTest中是Junit单元测试的代码,至于pom.xml,则给出了项目的一些基本信息以及依赖关系。 看一下App.java和AppTest.java内容: #catApp.java packagehelloworld; /** *Helloworld! * */ publicclassApp { publicstaticvoidmain(String[]args) { System.out.println("HelloWorld!"); } } #catAppTest.java packagehelloworld; importjunit.framework.Test; importjunit.framework.TestCase; importjunit.framework.TestSuite; /** *UnittestforsimpleApp. */ publicclassAppTest extendsTestCase { /** *Createthetestcase * *@paramtestNamenameofthetestcase */ publicAppTest(StringtestName) { super(testName); } /** *@returnthesuiteoftestsbeingtested */ publicstaticTestsuite() { returnnewTestSuite(AppTest.class); } /** *RigourousTest:-) */ publicvoidtestApp() { assertTrue(true); } } 再看一下pom.xml文件 #catpom.xml <projectxmlns="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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>helloworld</groupId> <artifactId>helloworld</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>helloworld</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project> 解释:在pom.xml文件中,首先描述了项目的定义,groupId:artifactId:version:packaging这个四元组能够唯一标记一个项目。我们不仅可以用这个四元组来标记我们的项目,也可以用来标记其它的项目,比如用来描述项目依赖关系。properties中定义了项目的属性,也可以在这里定义变量并在其它的地方引用。至于最后的dependencies,则是描述了项目的依赖关系,Maven会根据依赖关系自动下载相应的文件并在编译时使用。在大型项目开发中,往往会将其分成若干个子项目,每个子项目都有着自己的的pom.xml,它们与父pom.xml之间相当于继承的关系。可以说,pom.xml文件的配置是整个Maven的核心重点,也是学习Maven过程中需要详细了解的内容。这里只给出了最简单的配置样例,详细了解可以查看官方文档。 c、编译并运行helloworld项目(需要联网,因为Maven会自动下载依赖包。) #cd/root/helloworld/ #mvnpackage [INFO]Scanningforprojects... [INFO] [INFO]------------------------------------------------------------------------ [INFO]Buildinghelloworld1.0-SNAPSHOT [INFO]------------------------------------------------------------------------ Downloading: ………………##信息太多,此处省略 Downloaded:https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.12.4/surefire-junit3-2.12.4.jar(26KBat23.5KB/sec) ------------------------------------------------------- TESTS ------------------------------------------------------- Runninghelloworld.AppTest Testsrun:1,Failures:0,Errors:0,Skipped:0,Timeelapsed:0.001sec Results: Testsrun:1,Failures:0,Errors:0,Skipped:0 [INFO] [INFO]---maven-jar-plugin:2.4:jar(default-jar)@helloworld--- Downloading: ………………##此处省略 [INFO]Buildingjar:/root/helloworld/target/helloworld-1.0-SNAPSHOT.jar [INFO]------------------------------------------------------------------------ [INFO]BUILDSUCCESS [INFO]------------------------------------------------------------------------ [INFO]Totaltime:01:46min [INFO]Finishedat:2016-06-22T10:31:06+08:00 [INFO]FinalMemory:16M/40M [INFO]------------------------------------------------------------------------ 可以看到打包成功了!! 注:下载的依赖包会保存在~/.m2/repository文件夹中,打开这个文件夹,我们会发现里面的包正是按前面所说的四元组目录结构进行存储的。Maven在依赖一个jar包时会先去本地库查找,如果没找到就会从网上下载。当然,并不是所有的包都能从网上下载到,比如我们自己开发的jar包,这时,我们就可以用mvn install命令将一个项目安装到本地仓库。 打包成功后我们会发现项目中多了一个target文件夹,目录结构如下 #treehelloworld/ helloworld/ ├──pom.xml ├──src │├──main ││└──java ││└──helloworld ││└──App.java │└──test │└──java │└──helloworld │└──AppTest.java └──target ├──classes │└──helloworld │└──App.class ├──helloworld-1.0-SNAPSHOT.jar ├──maven-archiver │└──pom.properties ├──maven-status │└──maven-compiler-plugin │├──compile ││└──default-compile ││├──createdFiles.lst ││└──inputFiles.lst │└──testCompile │└──default-testCompile │├──createdFiles.lst │└──inputFiles.lst ├──surefire-reports │├──helloworld.AppTest.txt │└──TEST-helloworld.AppTest.xml └──test-classes └──helloworld └──AppTest.class 20directories,13files 可以看到,在package过程中,maven完成了编译、测试代码,生成测试报告,生成jar包等一系列工作。 d、手动运行jar包查看结果 #cd/tmp #java-cp/root/helloworld/target/helloworld-1.0-SNAPSHOT.jarhelloworld.App HelloWorld! e、Maven常用命令介绍: Maven的命令非常多,学习命令首先要了解Maven的生命周期。 Maven首先会验证并处理引用资源,之后进行项目编译,如果没有声明跳过测试,也会编译测试代码并进行测试、以成测试报告。最后,Maven会将编译好的内容进行打包,用于发布。Maven命令与Maven的生命周期有着对应的关系,一个命令也经常会包含多个生命周期,比如mvn package会完成以上所有步骤。 这里列举几个常用的命令: mvncompile编译项目 mvntest编译运行单元测试 mvnpackage打包(jarorwar) mvninstall将项目安装到本地仓库 mvnclean清空项目 mvneclipse:eclipse生成eclipse工程 Maven安装配置部分参考链接:http://www.c4fun.cn/blog/2014/10/10/maven-study/ 五、通过Jenkins平台,自动构建jar或者war格式的代码包 1、首先测试拉取代码情况 前面已经在Jenkins配置了一个test_app项目,现在测试构建的情况,选择项目名,如下: 然后在弹出页面的左侧选择“立即构建”,会出现一个进度条,然后点进去,在弹出页面的左侧选择“Console Output”,会看到整个构建过程输出的log,太多了,不能完全贴出来,不过最后是构建失败了,如下图: 根据错误信息初步判断是一些jar包没有下载成功或者不存在导致的,先放这里,待会再介绍如何解决这个问题。 到Jenkins服务器查看,代码是否已经从git拉取到本机了 #cd/root/.jenkins/workspace##此时你会看到test_app目录已经存在了 #lltest_app##代码也已经拉取到本地了 total16 drwxr-xr-x2rootroot4096Jun2120:58build -rw-r--r--1rootroot5922Jun2120:58pom.xml drwxr-xr-x3rootroot4096Jun2120:58src 2、解决第1步出现的问题 这里涉及到了maven镜像中央仓库,如果安装好maven之后,没有设置中央仓库(注释掉的),所以无法获取到需要的jar包,就会报错了 设置仓库地址的配置文件在maven的安装目录中,叫settings.xml #cd/usr/local/maven/conf #catsettings.xml|grepurl-A12-B12 |serverforthatrepository. |--> <mirrors> <!--mirror##是注释掉的 |Specifiesarepositorymirrorsitetouseinsteadofagivenrepository.Therepositorythat |thismirrorserveshasanIDthatmatchesthemirrorOfelementofthismirror.IDsareused |forinheritanceanddirectlookuppurposes,andmustbeuniqueacrossthesetofmirrors. | <mirror> <id>mirrorId</id> <mirrorOf>repositoryId</mirrorOf> <name>HumanReadableNameforthisMirror.</name> <url>##而且此处的地址也是无法访问的 </mirror> --> </mirrors> <!--profiles 那需要如何解决这个问题呢,有几种方式: 第一种是使用互联网开放的仓库地址: a、网上看到的一个开放的仓库地址是国外google的,如下: <mirrors> <mirror> <id>google-maven-central</id> <name>GoogleMavenCentral</name> <url>https://maven-central.storage.googleapis.com</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> 于是决定测试一下,将settings.xml文件修改为如下: #catsettings.xml <?xmlversion="1.0"encoding="UTF-8"?> <settingsxmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!--<localRepository>D:\bisoft\tools\maven3\repository</localRepository>--> <pluginGroups> <!--<pluginGroup>org.mortbay.jetty</pluginGroup> <pluginGroup>org.codehaus.cargo</pluginGroup>--> </pluginGroups> <proxies> </proxies> <servers> <server> <id>releases</id> <username>deployment</username> <password>deployment</password> </server> <server> <id>snapshots</id> <username>deployment</username> <password>deployment</password> </server> </servers> <mirrors> <mirror> <id>google-maven-central</id> <mirrorOf>central</mirrorOf> <url>https://maven-central.storage.googleapis.com</url>##改为google仓库 </mirror> </mirrors> <profiles> <profile> <id>google-maven-central</id> <repositories> <repository> <id>google-maven-central</id> <name>google-maven-central</name> <url>https://maven-central.storage.googleapis.com</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>google-maven-central</id> <name>google-maven-central</name> <url>https://maven-central.storage.googleapis.com</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>google-maven-central</activeProfile> </activeProfiles> </settings> </settings> 然后测试构建项目,不过结果是失败的,原因大家估计已经知道了,在国内google是被墙的,所以无法获取一些jar包,错误提示如下: 所以这种方式行不通,就放弃了! b、国内的一个开源中国的Maven镜像仓库地址,如下: <mirrors> <mirror> <id>nexus-osc</id> <mirrorOf>*</mirrorOf> <name>Nexusosc</name> <url>http://maven.oschina.net/content/groups/public/</url> </mirror> </mirrors> 经过测试也是不行的,网上说有时还可以,有时候不行,就是不稳定! 此处参考链接:http://www.linuxidc.com/Linux/2016-01/127012.htm 第二种是自己构建中央仓库,自己调用,下一篇文章中再介绍。 初学,不足之处请多多指出,谢谢!

优秀的个人博客,低调大师

在Springboot中集成unihttp后应用无法启动的解决办法

在当今的软件开发领域,SpringBoot框架以其简洁、高效、灵活的特点,成为了众多开发者构建Java应用程序的首选。它能够帮助开发者快速搭建项目,简化繁琐的配置过程,让开发变得更加高效和便捷。而UniHttp作为一个声明式的HTTP接口对接框架,也以其独特的魅力吸引了众多开发者的目光。它能够极大地简化HTTP请求的发送过程,让开发者像调用本地方法一样发起HTTP请求,无需关注请求的发送细节、参数传递、结果处理和反序列化等问题,从而更加专注于业务逻辑的实现。

优秀的个人博客,低调大师

多 Provider LLM 集成指南:何时使用 Codelux CLI,何时需要 AI Gateway?

第一个 LLM API 接入通常并不复杂:保存一个 API Key,调用一个接口,再处理模型返回的文本。真正的摩擦往往出现在第二个、第三个 Provider 加入之后。凭证开始散落在 .env 文件、Shell 配置、IDE 设置、本地客户端和测试脚本中;不同服务使用不同的模型标识、接口地址或参数约定;团队成员也可能无法确认当前请求究竟发往哪个 Provider。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册