技术标签: git java zookeeper maven OSS eclipse
用于GIT私有仓库及GIT客户端使用
安装Git
yum install -y git
注意:目前操作需要在root用户下
也可以到官方的镜像下载想要的版本,自行构建
https://mirrors.edge.kernel.org/pub/software/scm/git/
安装完后检查版本
git versión
输出如下即可
git version 2.18.2
新增GIT用户
adduser aliyungit
设置GIT用户密码
echo “aliyungit:aliyungit | chpasswd
禁用shell登录
基于安全考虑,git用户不允许SSH登录,修改/etc/passwd文件中GIT用户设置
vi /etc/passwd
将/bin/bash更改为/usr/bin/git-shell
aliyungit:x:1000:1000::/home/aliyungit:/bin/bash
改为:
aliyungit:x:1000:1000::/home/aliyungit: /usr/bin/git-shell
注意: git用户可以通过ssh使用git,但无法登录shell, git-shell每次一登录就自动退出。
SSH客户端验证连接,格式如下
ssh账号名@服务器IP COMMAND
如
ssh [email protected] ls -ltr /home/aliyungit/test.git
第一次连接有警告,输入yes继续。如果可以连接上,说明 ssh连接正常。
切换到git用户
su – aliyungit
创建私有仓库路径进入用户目录,将git目录设置成为git用户所有
mkdir /home/aliyungit/myserver.git
初始化git仓库
git init –bare
输出如下,表示成功
Initialized empty Git repository in /home/aliyungit/myserver.git
初始化完成后,Eclipse GIT客户端就使用此仓库,上传或下载代码。
注意:git命令—bare参数,在当前目录创建一个裸仓库,没有工作区的文件,其次此目录仅用于存储仓库的历史版本等数据。
用于Eclipse开发工具使用
在Eclipse工具中指定创建RSA Key,当前环境使用SSH方式连接GIT
在Eclipse菜单Preferences中,指向General->Network Connection->SSH2->Key Management标签,点击Generate RSA Key按钮,生成证书
生成证书文件会在General标签中指定目录产生,如图中c:\users\user1.ssh
找到目录中将目录中后缀pub文件,如id_rsa.pub
将目录中后缀pub文件复制到LINUX GIT主机上,通过SFTP上传到Linux GIT主机上,路径在/home/aliyungit/.ssh目录下,文件名称改名为win_id_rsa.pub
登录LINUX GIT主机, 切换到aliyungit用户
su - aliyungit
进入.ssh目录
cd /home/aliyungit/.ssh
将window环境中私钥文件内容追加到authorized_keys文件
cat win_id_rsa.pub >> authorized_keys
LINUX环境中,调整SSH参数
部分LINUX环境需要设置SSH参数来开启RSA认证
vi /etc/ssh/sshd_config
确认以下三个参数设置,如有行首有字符”#”代表注释没有设置,需要去除行首注释”#”。
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
在window环境中,使用SSH客户端验证连接,格式如下
ssh账号名@服务器IP 命令
如
ssh [email protected] ls -ltr /home/aliyungit/test.git
注意:第一次连接有警告,输入yes继续。如果可以连接上,说明 ssh连接正常。
如果window没有安装SSH客户端,请安装SSH工具后再来测试。
用于在Eclipse开发工具中开发代码,上传到GIT私有仓库
在Eclipse中,打开Window->Perspective->OpenPerspective->Other
在打开窗口中,选择Git后,点击Open
打开GitRepositories中,点击Clone a Repository
输入Linux GIT远程私有仓库地址
配置完成后,可以在GitRepositories看到新建Git仓库
用于Eclipse开发工具中开发代码
设置Maven存储库,加入aliyun 存储库,
在用户路径下子目录.m2中,增加文件setting.xml
C:\Users\USER1.m2
配置文本内容如下
<?xml version="1.0" encoding="UTF-8" ?>
<settings xmlns="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.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
</servers>
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
</settings>
在Eclipse菜单Preferences中,指向General->Maven->User Setting中,设置Global Setting以及User Setting输入框,完成后点击Update Setting
在Eclipse菜单栏中,子菜单Show View 中选择 Other
在弹出对话框选择Maven Repositories,
在存储库树视图中,可以看到新增的全局存储库
下载安装包
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
解压安装包到执行路径
tar -xvf apache-maven-3.6.3-bin.tar.gz -C /oss/apache-maven-3.6.3
设置环境变量的配置文件,修改profile文件
vim /etc/profile
新增以下五行
export JAVA_HOME=/etc/alternatives/java_sdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export MAVEN_HOME=/oss/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
重新刷新配置文件,即时生效修改的设置
source /etc/profile
验证是否安装
mvn -version
输出结果如下
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /oss/apache-maven-3.6.3
Java version: 1.8.0_252, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el8_1.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.18.0-147.5.1.el8_1.x86_64", arch: "amd64", family: "unix"
设置Maven存储库,加入aliyun 存储库,
在用户home路径下子目录.m2中,增加文件setting.xml
vi /root/.m2/settings.xml
配置文本内容如下
<?xml version="1.0" encoding="UTF-8" ?>
<settings xmlns="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.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
</servers>
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
</settings>
新建Maven项目
在Eclipse中如何创建Maven项目
创建Maven项目
打开菜单栏中New子菜单中MavenProject
勾选Create a Simple project (skip archetype selection),点击下一步
在GroupId输入名称,类似于集合或PackageName
在ArtifaceId输入当前项目名称,类似与WAR项目名称
点击完成Finish完成按钮
Eclipse会自动创建一个Maven项目,项目图标中会显示“m”字样,同时会创建一个pom.xml文件
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zc.test.zookeeper</groupId>
<artifactId>Demo1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.1</version>
</dependency>
</dependencies>
</project>
文件用Eclipse工具打开之后的图形配置界面
如果pom.xml发生更改,选中项目后打开右键菜单,Maven中选择子菜单Update Project即可
在弹出窗口中选择项目后,点击OK按钮
编写Test.java,
调用Zookeeper缺省API
package com.zc.demo.zookeeper;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooKeeper.States;
public class Test {
// 会话超时时间,设置为与系统默认时间一致
private static final int SESSION_TIMEOUT = 30 * 1000;
// 创建 ZooKeeper 实例
private ZooKeeper zk;
// 创建 Watcher 实例
private Watcher wh = new Watcher() {
/**
* Watched事件
*/
public void process(WatchedEvent event) {
System.out.println("WatchedEvent >>> " + event.toString());
}
};
// 初始化 ZooKeeper 实例
private void createZKInstance() throws IOException {
// 连接到ZK服务,多个可以用逗号分割写
zk = new ZooKeeper("localhost:2181,localhost:2182,localhost:2183", Test.SESSION_TIMEOUT, this.wh);
if(!zk.getState().equals(States.CONNECTED)){
while(true){
if(zk.getState().equals(States.CONNECTED)){
break;
}
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private void ZKOperations() throws IOException, InterruptedException, KeeperException {
System.out.println("\n1. Create ZooKeeper Node (znode : zoo2, Data: myData2 ,Permissions: OPEN_ACL_UNSAFE ,NodeType: Persistent");
zk.create("/zoo2", "myData2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("\n2. See whether to create success: ");
System.out.println(new String(zk.getData("/zoo2", this.wh, null)));// 添加Watch
// 前面一行我们添加了对/zoo2节点的监视,所以这里对/zoo2进行修改的时候,会触发Watch事件。
System.out.println("\n3. Go to modify the node data ");
zk.setData("/zoo2", "shanhy20160310".getBytes(), -1);
// 这里再次进行修改,则不会触发Watch事件,这就是我们验证ZK的一个特性“一次性触发”,也就是说设置一次监视,只会对下次操作起一次作用。
System.out.println("\n3-1. Modify the node data again ");
zk.setData("/zoo2", "shanhy20160310-ABCD".getBytes(), -1);
System.out.println("\n4. See if modified successfully: ");
System.out.println(new String(zk.getData("/zoo2", false, null)));
System.out.println("\n5. Remove nodes ");
zk.delete("/zoo2", -1);
System.out.println("\n6. Check to see if the node is removed: ");
System.out.println(" Node State: [" + zk.exists("/zoo2", false) + "]");
}
private void ZKClose() throws InterruptedException {
zk.close();
}
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
Test dm = new Test();
dm.createZKInstance();
dm.ZKOperations();
dm.ZKClose();
}
}
调用Zookeeper第三方方法库I0Itec.zkclient
package com.zc.demo.zookeeper;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.I0Itec.zkclient.DataUpdater;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.IZkStateListener;
import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.KeeperState;
/**
*/
public class ZkClientTest {
public static void main(String[] args) {
ZkClient zkClient = new ZkClient("localhost:2181,localhost:2182,localhost:2183");
String node = "/myapp";
// 订阅监听事件
childChangesListener(zkClient, node);
dataChangesListener(zkClient, node);
stateChangesListener(zkClient);
if (!zkClient.exists(node)) {
zkClient.createPersistent(node, "hello zookeeper");
}
System.out.println(zkClient.readData(node).toString());
zkClient.updateDataSerialized(node, new DataUpdater<String>() {
public String update(String currentData) {
return currentData + "-123";
}
});
System.out.println(zkClient.readData(node).toString());
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 订阅children变化
*
* @param zkClient
* @param path
* @author SHANHY
* @create 2016年3月11日
*/
public static void childChangesListener(ZkClient zkClient, final String path) {
zkClient.subscribeChildChanges(path, new IZkChildListener() {
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
System.out.println("clildren of path " + parentPath + ":" + currentChilds);
}
});
}
/**
* 订阅节点数据变化
*
* @param zkClient
* @param path
* @author SHANHY
* @create 2016年3月11日
*/
public static void dataChangesListener(ZkClient zkClient, final String path){
zkClient.subscribeDataChanges(path, new IZkDataListener(){
public void handleDataChange(String dataPath, Object data) throws Exception {
System.out.println("Data of " + dataPath + " has changed.");
}
public void handleDataDeleted(String dataPath) throws Exception {
System.out.println("Data of " + dataPath + " has changed.");
}
});
}
/**
* 订阅状态变化
*
* @param zkClient
* @author SHANHY
* @create 2016年3月11日
*/
public static void stateChangesListener(ZkClient zkClient){
zkClient.subscribeStateChanges(new IZkStateListener() {
public void handleStateChanged(KeeperState state) throws Exception {
System.out.println("handleStateChanged");
}
public void handleSessionEstablishmentError(Throwable error) throws Exception {
System.out.println("handleSessionEstablishmentError");
}
public void handleNewSession() throws Exception {
System.out.println("handleNewSession");
}
});
}
}
其后,将应用加入到Git仓库,选中应用后,在右键菜单中,选择Team->ShareProject
在弹出窗口中,Repository的下拉菜单中选择新建仓库后,点击Finish
OpenPerspective中打开在Git ,进入Git Staging中,选择所有Unstaged Changes,点击添加
输入CommitMessage后,点击Commit and Push
从GIT私有仓库下载代码到Linux环境运行
初始化本地仓库
创建git本地仓库路径
mkdir /oss/eclipse-ws
从远程获取最新版本并merge到本地,执行git pull命令
cd /oss/eclipse-ws
git clone [email protected]:/home/aliyungit/myserver.git
注意:路径必须是新建路径
语法如下
git clone 用户名@服务器IP:/相对用户根目录的git仓库绝对路径/git仓库名.git
从远程获取最新版本并merge到本地
在”.git”平级目录下,执行git pull命令
cd /oss/eclipse-ws/myserver
git pull
在提示中输入用户密码
[email protected]'s password:
输出日志
remote: Enumerating objects: 39, done.
remote: Counting objects: 100% (39/39), done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 28 (delta 10), reused 0 (delta 0)
Unpacking objects: 100% (28/28), done.
From 127.0.0.1:/home/aliyungit/myserver
19106be..0a897ff master -> origin/master
Updating 19106be..0a897ff
Fast-forward
DemoZK1/pom.xml | 118 +++++++++-----
.../src/main/java/com/zc/demo/zookeeper/Test.java | 180 ++++++++++-----------
2 files changed, 166 insertions(+), 132 deletions(-)
注意: 在”.git”平级目录下执行
可以检查DemoZK1/pom.xml 文件内容,已经与Eclipse开发中同步。
在应用目录放置pom.xml文件的目录下,执行mvn package
cd /oss/eclipse-ws/myserver/DemoZK1
mvn package
输出如下
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.zc.test.zookeeper:Demo1:jar:0.0.1-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-jar-plugin is missing. @ line 43, column 21
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] --------------------< com.zc.test.zookeeper:Demo1 >---------------------
[INFO] Building Demo1 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-dependency-plugin/2.8/maven-dependency-plugin-2.8.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-dependency-plugin/2.8/maven-dependency-plugin-2.8.pom (11 kB at 4.8 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-dependency-plugin/2.8/maven-dependency-plugin-2.8.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-dependency-plugin/2.8/maven-dependency-plugin-2.8.jar (153 kB at 44 kB/s)
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Demo1 ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /oss/eclipse-ws/myserver/DemoZK1/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ Demo1 ---
[INFO] Changes detected - recompiling the module!
…
…
[INFO] Copying zookeeper-3.6.1.jar to /oss/eclipse-ws/myserver/DemoZK1/target/lib/zookeeper-3.6.1.jar
[INFO] Copying netty-resolver-4.1.48.Final.jar to /oss/eclipse-ws/myserver/DemoZK1/target/lib/netty-resolver-4.1.48.Final.jar
[INFO] Copying netty-transport-native-epoll-4.1.48.Final.jar to /oss/eclipse-ws/myserver/DemoZK1/target/lib/netty-transport-native-epoll-4.1.48.Final.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:44 min
[INFO] Finished at: 2020-06-09T23:52:23+08:00
[INFO] ------------------------------------------------------------------------
注意:在应用目录放置pom.xml文件的目录下,
打包仅包括应用类,不包括依赖包,依赖包下载到目录中,运行时指定查找
<build>
<plugins>
<!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.zc.demo.zookeeper.Test</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 拷贝依赖的jar包到lib目录 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
打包命令,会在应用目录创建子目录target,并创建打包jar文件,如” Demo1-0.0.1-SNAPSHOT.jar”
[[email protected] DemoZK1]#cd /oss/eclipse-ws/myserver/DemoZK1
[[email protected] DemoZK1]# ls -ltr /oss/eclipse-ws/myserver/DemoZK1/target
total 12
drwxr-xr-x 3 root root 35 Jun 10 00:07 maven-status
drwxr-xr-x 3 root root 25 Jun 10 00:07 generated-sources
drwxr-xr-x 3 root root 17 Jun 10 00:07 classes
drwxr-xr-x 2 root root 28 Jun 10 00:07 maven-archiver
-rw-r--r-- 1 root root 5368 Jun 10 00:07 Demo1-0.0.1-SNAPSHOT.jar
drwxr-xr-x 2 root root 4096 Jun 10 00:07 lib
注意:在应用目录创建子目录target,以及打包文件
打包jar文件内部文件MANIFEST.MF 指定相关信息,路径如下
Demo1-0.0.1-SNAPSHOT.jar ->META-INF->MANIFEST.MF
MANIFEST.MF文件内容如下
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: root
Class-Path: lib/zookeeper-3.6.1.jar lib/commons-lang-2.6.jar lib/zooke
eper-jute-3.6.1.jar lib/audience-annotations-0.5.0.jar lib/netty-hand
ler-4.1.48.Final.jar lib/netty-common-4.1.48.Final.jar lib/netty-reso
lver-4.1.48.Final.jar lib/netty-buffer-4.1.48.Final.jar lib/netty-tra
nsport-4.1.48.Final.jar lib/netty-codec-4.1.48.Final.jar lib/netty-tr
ansport-native-epoll-4.1.48.Final.jar lib/netty-transport-native-unix
-common-4.1.48.Final.jar lib/slf4j-api-1.7.25.jar lib/slf4j-log4j12-1
.7.25.jar lib/log4j-1.2.17.jar
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_252
Main-Class: com.zc.demo.zookeeper.Test
Test.java运行测试
在应用目录子目录target,启动打包文件应用验证
[[email protected] target]# cd /oss/eclipse-ws/myserver/DemoZK1/target
[[email protected] target]# java -jar Demo1-0.0.1-SNAPSHOT.jar
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
WatchedEvent >>> WatchedEvent state:SyncConnected type:None path:null
1. Create ZooKeeper Node (znode �� zoo2, Data�� myData2 ��Permissions�� OPEN_ACL_UNSAFE ��NodeType�� Persistent
2. See whether to create success��
myData2
3. Go to modify the node data
WatchedEvent >>> WatchedEvent state:SyncConnected type:NodeDataChanged path:/zoo2
3-1. Modify the node data again
4. See if modified successfully��
shanhy20160310-ABCD
5. Remove nodes
6. Check to see if the node is removed��
Node State�� [null]
WatchedEvent >>> WatchedEvent state:Closed type:None path:null
注意:在应用目录子目录target
执行应用验证
[[email protected] target]# java -jar Demo1-0.0.1-SNAPSHOT.jar
log4j:WARN No appenders could be found for logger (org.I0Itec.zkclient.ZkConnection).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
clildren of path /myapp:[]
Data of /myapp has changed.
hello zookeeper
hello zookeeper-123
Data of /myapp has changed.
注意:在应用目录子目录target
与前一个pom.xml区别不大,主要新增依赖包zkclient,
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency>
以及调整mainclass为ZkClientTest
<mainClass>com.zc.demo.zookeeper.ZkClientTest</mainClass>
编译时可能提示如下报错
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project Demo1: Compilation failure
[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
解决方法:增加环境变量执行JDK路径
设置环境变量的配置文件,修改profile文件
vim /etc/profile
新增以下三行
export JAVA_HOME=/etc/alternatives/java_sdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
重新刷新配置文件,即时生效修改的设置
source /etc/profile
1. 创建Maven的普通java项目:
mvn archetype:create
-DgroupId=packageName
-DartifactId=projectName
2. 创建Maven的Web项目:
mvn archetype:create
-DgroupId=packageName
-DartifactId=webappName
-DarchetypeArtifactId=maven-archetype-webapp
3. 编译源代码: mvn compile
4. 编译测试代码:mvn test-compile
5. 运行测试:mvn test
6. 产生site:mvn site
7. 打包:mvn package
8. 在本地Repository中安装jar:mvn install
9. 清除产生的项目:mvn clean
10. 生成eclipse项目:mvn eclipse:eclipse
11. 生成idea项目:mvn idea:idea
12. 组合使用goal命令,如只打包不测试:mvn -Dtest package
13. 编译测试的内容:mvn test-compile
14. 只打jar包: mvn jar:jar
15. 只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile
( -skipping 的灵活运用,当然也可以用于其他组合命令)
16. 清除eclipse的一些系统设置:mvn eclipse:clean
17. 获取依赖包: mvn dependency:get -DremoteRepositories=http://repo1.maven.org/maven2/ \
-DgroupId=junit -DartifactId=junit -Dversion=4.8.2 \
-Dtransitive=false -Ddest=./
专用名词的译名如下。
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库
一、新建代码库
# 在当前目录新建一个Git代码库
$ git init
# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]
# 下载一个项目和它的整个代码历史
$ git clone [url]
二、配置
Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。
# 显示当前的Git配置
$ git config --list
# 编辑Git配置文件
$ git config -e [--global]
# 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"
三、增加/删除文件
# 添加指定文件到暂存区
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add .
# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
四、代码提交
# 提交暂存区到仓库区
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
五、分支
# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
# 新建一个分支,并切换到该分支
$ git checkout -b [branch]
# 新建一个分支,指向指定commit
$ git branch [branch] [commit]
# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 切换到上一个分支
$ git checkout -
# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到当前分支
$ git merge [branch]
# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
# 本地存在一个分支,名称叫:develop_chen,但远程没有怎么办?
git push origin develop_chen
这样就在远程建立一个和本地一样的分支
git branch --set-upstream-to=origin/develop develop 本地分支和远程分支简历跟踪关系
六、标签
# 列出所有tag
$ git tag
# 新建一个tag在当前commit
$ git tag [tag]
# 新建一个tag在指定commit
$ git tag [tag] [commit]
# 删除本地tag
$ git tag -d [tag]
# 删除远程tag
$ git push origin :refs/tags/[tagName]
# 查看tag信息
$ git show [tag]
# 提交指定tag
$ git push [remote] [tag]
# 提交所有tag
$ git push [remote] --tags
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]
七、查看信息
# 显示有变更的文件
$ git status
# 显示当前分支的版本历史
$ git log
# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat
# 搜索提交历史,根据关键词
$ git log -S [keyword]
# 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s
# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature
# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]
# 显示指定文件相关的每一次diff
$ git log -p [file]
# 显示过去5次提交
$ git log -5 --pretty --oneline
# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn
# 显示指定文件是什么人在什么时间修改过
$ git blame [file]
# 显示暂存区和工作区的代码差异
$ git diff
# 显示暂存区和上一个commit的差异
$ git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]
# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"
# 显示某次提交的元数据和内容变化
$ git show [commit]
# 显示某次提交发生变化的文件
$ git show --name-only [commit]
# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]
# 显示当前分支的最近几次提交
$ git reflog
# 从本地master拉取代码更新当前分支:branch 一般为master
$ git rebase [branch]
八、远程同步
$ git remote update --更新远程仓储
# 下载远程仓库的所有变动
$ git fetch [remote]
# 显示所有远程仓库
$ git remote -v
# 显示某个远程仓库的信息
$ git remote show [remote]
# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]
# 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]
# 上传本地指定分支到远程仓库
$ git push [remote] [branch]
# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force
# 推送所有分支到远程仓库
$ git push [remote] --all
九、撤销
# 恢复暂存区的指定文件到工作区
$ git checkout [file]
# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]
# 恢复暂存区的所有文件到工作区
$ git checkout .
# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]
# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard
# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]
# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]
# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]
# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]
# 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop
十、用户名操作:
# 查看用户名:
$ git config user.name
# 查看用户邮箱:
$ git config user.email
# 修改命令:
# 修改用户名:
$ git config --global user.name "Your_username"
# 修改用户邮箱:
$ git config --global user.email "Your_email"
十 一、其他(合并两个分支:Merge)
1,将开发分支代码合入到master中
git checkout dev #切换到dev开发分支
git pull
git checkout master
git merge dev #合并dev分支到master上
git push origin master #将代码推到master上
2,将master的代码同步更新到开发分支中
merge方法:保证主干提交线干净(可以安全回溯)
git checkout master
git pull
git checkout dev
git merge master
git pull origin dev
# 生成一个可供发布的压缩包
$ git archive
Zookeeper的集群配置和Java测试程序
https://blog.csdn.net/catoop/article/details/50848555
MAC学习表,是使用学习动作(actions=learn())来学习得到的。1 MAC学习表学到的样式如下,table=10,vlan_tci=0x0014/0x0fff, dl_dst=00:50:00**04 actions=load:0x4->NXM_NX_REG0[0..15]table=10,vlan_tci=0x0015/0x0fff, dl_dst=00:50:00**0
UVA 11401 Triangle CountingUVA 11806 CheerleadersLA 3516 Exploring PyramidsUVA 11361 Investigating Div-Sum PropertyLA 4123 Glenbow MuseumUVA 10253 Series-Parallel NetworksUVA 11038 How many 0sUV
GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub。GitHub于2008年4月10日正式上线,除了Git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。托管版本数量也是非常之多,其中不乏知名开源项目 Ruby on Rails、jQuer...
上一期我们已经更新了360脱壳+修复的教程,不知道小伙伴们学会没有,今天我们将走进腾讯的壳,再一次还原软件本来的状态!来了废话不多说,我们今天来脱壳,和昨天一样的工具:反射大师虚拟大师MT管理器然后准备今天脱壳的软件程序:全力万花筒这是一个酷安的小伙伴开发的程序,我用过挺有意思的,但是就是有很多广告,然后是腾讯加固让我产生了想脱壳的想法!可以看到是腾讯御安全加固,我们接下来和昨天一样先脱壳,我们打...
近段时间处理,由于工作需求,需要使得用户插入的emoji表情能够正常显示及使用,所以做个总结,以备后用。说明:本方法只在mysql环境中测试1.首先程序在连接数据库时,要指定数据库字符集的设置charset="utf8mb4" 2.建表的字符集要设置charset=utf8mb4如图所示: 3.字段要设置排序规则 ...
1.meta-viewport适配背景viewport:中文的意思就是“视口”,通常就是浏览器用于显示页面的区域,但是在移动端,viewport一般都要大于浏览器的可视区域,保证PC页面在移动页面上面的可视性,这是因为考虑到移动设备的分辨率相对于桌面电脑来说都比较小,所以为了能在移动设备上正常显示那些传统的为桌面浏览器设计的网站,移动设备上的浏览器都会把自己默认的viewport设为980px...
一、什么是 HBS 3HBS 3 是 Hybrid Backup sync 3 的缩写,意为混合型备份与同步中心,主要是将数据备份、复原、同步等功能整合到单一 QTS 应用中,让您可轻松将 QNAP NAS 中的数据备份或同步到另一台 QNAP NAS、远程服务器或云端备份空间中。重复数据删除 (QuDedup) 技术可加速多版本备份效率,节省带宽及存储空间。当意外发生时,HBS 3 更协助您迅速...
我在上一篇《Android OTA 相关工具(一) 虚拟 A/B 之 snapshotctl》 中介绍了从虚拟 A/B 系统 (Android R)开始引入的 snapshot 调试工具 snapshotctl。snapshotctl 本身可以做不少事情,比方说 dump 升级信息, map 和 unmap 各种虚拟分区等。这一篇介绍动态分区调试工具 dmctl,配合 snapshotctl 工具,对各种 dm 开头的动态分区和虚拟分区进行调试更加方便。
一、实验环境Python2.7 + Django1.10.0二、获取QQ邮箱授权码1、什么是授权码?授权码是QQ邮箱推出的,用于登录第三方客户端的专用密码。适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。温馨提醒:为了你的帐户安全,更改QQ密码以及独立密码会触发授权码过期,需要重新获取新的授权码登录。2、怎...
文章目录一、Device Mapper1. Device Mapper概述2. Device Mapper的使用二、Dm Verity1. Dm Verity验证思想2. Hashtree脚本处理2.1 镜像编译2.2 创建verity tree2.3 创建metadata3. Dm verity设备的创建3.1 SetUpDmVerity函数3.2 hash table处理一、Device Mapper1. Device Mapper概述Device mapper是LINUX提供的一种逻辑设备到物理
今天写Android程序,遇到了java.lang.RuntimeException: Unable to instantiate activity ComponentInfo这个错误,原来是我的AndroidManifest.xml文件配置有误。以下是我本来的配置文件,我改过包名的。原来错误是在android:name=".LogoActivity",因为我的LogoActivity.java是...
开头在Android开发当中,相信大家对第三方库的重要性是无需多说的,尤其是三方库源码更是重中之重,而EventBus源码就属于其中的一个重点。EventBus是安卓(Java中也可以用)开发中非常流行的一个第三方库,是一种发布/订阅事件的总线.想必每个入了门的Android开发者都多少对EventBus有过了解,EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递。EventBus使用简单,并将事件发布和订阅充分解耦,从而使代码更简洁。一直以来