java项目构建部署包

 

  • 博客分类:
  • JAVA

     Java 工程在生产环境运行时,一般需要构建成一个jar,同时在运行时需要把依赖的jar添加到classpath中去,如果直接运行添加classpath很不方便,比较方便的是创建一个shell脚本。在公司项目中看到把工程代码和依赖jar包合并到一块,省去设置classpath的麻烦。但这样把项目jar依赖绑定死,被其它项目引入,容易造成jar依赖冲突,如果用maven管理java项目,导致提交到公司仓库jar过于庞大,同时也失去maven对jar依赖管理的作用。
    为了方便java项目部署运行,这里为构建部署包定义一个固定格式:

/java 项目
   /lib    --存放所有依赖jar
   /conf   --存放配置文件,例如:log4j, spring, properties等配置文件,不放入jar是为
             了方便修改这些配置文件
   /logs   --运行时自动创建的目录,存放日志文件
   /bin    --存放运行脚本: server.sh 启动和停止项目运行。

如果在构建部署包时,需要我们手动去创建这样的目录,把文件拷贝相应目录,实在是太繁琐了,幸好maven为我们这样“懒惰”coder提供了一个很好的plugin:maven-assembly-plugin,可以去定制这样的部署结构

1:配置maven-assembly-plugin

Java代码 复制代码 收藏代码
  1. <plugin>   
  2.     <groupId>org.apache.maven.plugins</groupId>   
  3.     <artifactId>maven-assembly-plugin</artifactId>   
  4.     <configuration>   
  5.         <descriptors>   
  6.             <descriptor>src/main/assembly/assembly.xml</descriptor>   
  7.         </descriptors>   
  8.     </configuration>   
  9.     <executions>   
  10.         <execution>   
  11.             <id>make-assembly</id>   
  12.             <phase>package</phase>   
  13.             <goals>   
  14.                 <goal>single</goal>   
  15.             </goals>   
  16.         </execution>   
  17.     </executions>   
  18. </plugin>  
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>


2:assembly 配置打包格式

    定义在assembly.xml文件中,文件中配置信息不作过多解释,可以参考相应文档

Java代码 复制代码 收藏代码
  1. <assembly   
  2.     xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">   
  5.        
  6.     <id>bin</id>   
  7.     <formats>   
  8.         <format>tar.gz</format>   
  9.     </formats>   
  10.     <dependencySets>   
  11.         <dependencySet>   
  12.             <useProjectArtifact>true</useProjectArtifact>   
  13.             <outputDirectory>lib</outputDirectory>   
  14.             <scope>runtime</scope>   
  15.         </dependencySet>   
  16.     </dependencySets>   
  17.     <fileSets>   
  18.         <fileSet>   
  19.             <outputDirectory>/</outputDirectory>   
  20.             <includes>   
  21.                 <include>README.txt</include>   
  22.             </includes>   
  23.         </fileSet>   
  24.         <fileSet>   
  25.             <directory>src/main/scripts</directory>   
  26.             <outputDirectory>/bin</outputDirectory>   
  27.             <lineEnding>unix</lineEnding>   
  28.             <fileMode>0755</fileMode>   
  29.             <includes>   
  30.                 <include>*.sh</include>   
  31.             </includes>   
  32.         </fileSet>   
  33.         <fileSet>   
  34.             <directory>target/classes</directory>   
  35.             <outputDirectory>/conf</outputDirectory>   
  36.             <includes>   
  37.                 <include>*.xml</include>   
  38.             </includes>   
  39.         </fileSet>   
  40.     </fileSets>   
  41. </assembly>  
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>bin</id>
<formats>
<format>tar.gz</format>
</formats>
<dependencySets>
<dependencySet>
<useProjectArtifact>true</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<outputDirectory>/</outputDirectory>
<includes>
<include>README.txt</include>
</includes>
</fileSet>
<fileSet>
<directory>src/main/scripts</directory>
<outputDirectory>/bin</outputDirectory>
<lineEnding>unix</lineEnding>
<fileMode>0755</fileMode>
<includes>
<include>*.sh</include>
</includes>
</fileSet>
<fileSet>
<directory>target/classes</directory>
<outputDirectory>/conf</outputDirectory>
<includes>
<include>*.xml</include>
</includes>
</fileSet>
</fileSets>
</assembly>



下面这段配置主要从src/main/scripts目录获取shell脚本复制到bin目录。同时设置文件模式为unix,文件具有可执行权限。

Java代码 复制代码 收藏代码
  1. <directory>src/main/scripts</directory>   
  2. <outputDirectory>/bin</outputDirectory>   
  3. <lineEnding>unix</lineEnding>   
  4. <fileMode>0755</fileMode>   
  5. <includes>   
  6.     <include>*.sh</include>   
  7. </includes>  
<directory>src/main/scripts</directory>
<outputDirectory>/bin</outputDirectory>
<lineEnding>unix</lineEnding>
<fileMode>0755</fileMode>
<includes>
<include>*.sh</include>
</includes>

 

3:启动类设计

在学习metamorphosis的时候,对它的启动脚本做了一些了解,发现服务stop方式设计比较优雅,通过JMX连接JVM,去关闭系统内部资源,再kill掉进程。

UeapServerMBean定义stop方法,实现类UeapServer完成系统启动加载和停止功能。ServerStartup是main方法入口,调用 UeapServer启动方式,并注册 UeapServer到JMX中。


4:启动脚本

系统启动脚本分为了两个文件:

env.sh 配置一些环境变量和JVM参数,实际应用中只需要修改 SERVER_NAME、  STARTUP_CLASS和 UEAP_JVM_ARGS变量名称。

server.sh 实际运行脚本,提供启动、停止、运行状态查询、重启功能,实际应用中不需要改动该文件。

 

env.sh

 

Java代码 复制代码 收藏代码
  1. #!/bin/bash   
  2.   
  3. #Config your java home   
  4. #JAVA_HOME=/opt/jdk/   
  5.   
  6. if [ -z "$JAVA_HOME" ]; then   
  7.   export JAVA=`which java`   
  8. else  
  9.   export JAVA="$JAVA_HOME/bin/java"  
  10. fi   
  11.   
  12. UEAP_HOME=$BASE_DIR   
  13. SERVER_NAME="collect master"  
  14. STARTUP_CLASS="com.starit.ueap.collect.master.ServerStartup"  
  15.   
  16. #Ueap JMX port   
  17. export JMX_PORT=9123  
  18. export CLASSPATH=$BASE_DIR/conf:$(ls $BASE_DIR/lib/*.jar | tr '\n' :)   
  19.   
  20. #UEAP jvm args   
  21. UEAP_JVM_ARGS="-Xmx512m -Xms256m -server"  
  22. UEAP_JVM_ARGS="$UEAP_JVM_ARGS -cp $CLASSPATH -Dueap.home=$ueap_home -Dcollect.start.worker=false"  
  23.   
  24. if [ -z "$UEAP_ARGS" ]; then   
  25.   export UEAP_ARGS="$UEAP_JVM_ARGS"  
  26. fi  
#!/bin/bash
#Config your java home
#JAVA_HOME=/opt/jdk/
if [ -z "$JAVA_HOME" ]; then
export JAVA=`which java`
else
export JAVA="$JAVA_HOME/bin/java"
fi
UEAP_HOME=$BASE_DIR
SERVER_NAME="collect master"
STARTUP_CLASS="com.starit.ueap.collect.master.ServerStartup"
#Ueap JMX port
export JMX_PORT=9123
export CLASSPATH=$BASE_DIR/conf:$(ls $BASE_DIR/lib/*.jar | tr '\n' :)
#UEAP jvm args
UEAP_JVM_ARGS="-Xmx512m -Xms256m -server"
UEAP_JVM_ARGS="$UEAP_JVM_ARGS -cp $CLASSPATH -Dueap.home=$ueap_home -Dcollect.start.worker=false"
if [ -z "$UEAP_ARGS" ]; then
export UEAP_ARGS="$UEAP_JVM_ARGS"
fi

 

server.sh

 

Java代码 复制代码 收藏代码
  1. #!/bin/bash   
  2.   
  3. if [ -z "$BASE_DIR" ] ; then   
  4.   PRG="$0"  
  5.   
  6.   # need this for relative symlinks   
  7.   while [ -h "$PRG" ] ; do  
  8.     ls=`ls -ld "$PRG"`   
  9.     link=`expr "$ls" : '.*-> \(.*\)$'`   
  10.     if expr "$link" : '/.*' > /dev/null; then   
  11.       PRG="$link"  
  12.     else  
  13.       PRG="`dirname "$PRG"`/$link"  
  14.     fi   
  15.   done   
  16.   BASE_DIR=`dirname "$PRG"`/..   
  17.   
  18.   # make it fully qualified   
  19.   BASE_DIR=`cd "$BASE_DIR" && pwd`   
  20.   #echo "collect master is at $BASE_DIR"  
  21. fi   
  22.   
  23. source $BASE_DIR/bin/env.sh   
  24.   
  25. AS_USER=`whoami`   
  26. LOG_DIR="$BASE_DIR/logs"  
  27. LOG_FILE="$LOG_DIR/server.log"  
  28. PID_DIR="$BASE_DIR/logs"  
  29. PID_FILE="$PID_DIR/.run.pid"  
  30.   
  31. function running(){   
  32.     if [ -f "$PID_FILE" ]; then   
  33.         pid=$(cat "$PID_FILE")   
  34.         process=`ps aux | grep " $pid " | grep -v grep`;   
  35.         if [ "$process" == "" ]; then   
  36.             return 1;   
  37.         else  
  38.             return 0;   
  39.         fi   
  40.     else  
  41.         return 1  
  42.     fi     
  43. }   
  44.   
  45. function start_server() {   
  46.     if running; then   
  47.         echo "$SERVER_NAME is running."  
  48.         exit 1  
  49.     fi   
  50.   
  51.     mkdir -p $PID_DIR   
  52.     touch $LOG_FILE   
  53.     mkdir -p $LOG_DIR   
  54.     chown -R $AS_USER $PID_DIR   
  55.     chown -R $AS_USER $LOG_DIR   
  56.        
  57.     echo "$JAVA $UEAP_JVM_ARGS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false \   
  58.       -Dcom.sun.management.jmxremote.port=$JMX_PORT $STARTUP_CLASS"   
  59.     sleep 1  
  60.     nohup $JAVA $UEAP_JVM_ARGS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false \   
  61.       -Dcom.sun.management.jmxremote.port=$JMX_PORT $STARTUP_CLASS 2>&1 >>$LOG_FILE &     
  62.     echo $! > $PID_FILE   
  63.     chmod 755 $PID_FILE   
  64.     sleep 1;   
  65.     tail -F $LOG_FILE   
  66. }   
  67.   
  68. function stop_server() {   
  69.     if ! running; then   
  70.         echo "$SERVER_NAME is not running."  
  71.         exit 1  
  72.     fi   
  73.     count=0  
  74.     pid=$(cat $PID_FILE)   
  75.     while running;   
  76.     do  
  77.       let count=$count+1  
  78.       echo "Stopping $SERVER_NAME $count times"  
  79.       if [ $count -gt 5 ]; then   
  80.           echo "kill -9 $pid"  
  81.           kill -9 $pid   
  82.       else  
  83.           $JAVA $TOOLS_ARGS com.starit.ueap.common.shell.StopServerTool -host 127.0.0.1 -port $JMX_PORT $@   
  84.           kill $pid   
  85.       fi   
  86.       sleep 3;   
  87.     done       
  88.     echo "Stop $SERVER_NAME successfully."    
  89.     rm $PID_FILE   
  90. }   
  91.   
  92. function status(){   
  93.     if running; then   
  94.        echo "$SERVER_NAME is running."  
  95.     else  
  96.        echo "$SERVER_NAME was stopped."     
  97.     fi   
  98. }   
  99.     
  100. function help() {   
  101.     echo "Usage: server.sh {start|status|stop|restart|reload}" >&2  
  102.     echo "       start:             start the $SERVER_NAME server"  
  103.     echo "       stop:              stop the $SERVER_NAME server"  
  104.     echo "       restart:           restart the $SERVER_NAME server"  
  105.     echo "       status:            get $SERVER_NAME current status,running or stopped."  
  106. }   
  107.   
  108. command=$1  
  109. shift 1  
  110. case $command in   
  111.     start)   
  112.         start_server $@;   
  113.         ;;       
  114.     stop)   
  115.         stop_server $@;   
  116.         ;;   
  117.     status)   
  118.         status $@;   
  119.         ;;    
  120.     restart)   
  121.         $0 stop $@   
  122.         $0 start $@   
  123.         ;;   
  124.     help)   
  125.         help;   
  126.         ;;   
  127.     *)   
  128.         help;   
  129.         exit 1;   
  130.         ;;   
  131. esac  
#!/bin/bash
if [ -z "$BASE_DIR" ] ; then
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
BASE_DIR=`dirname "$PRG"`/..
# make it fully qualified
BASE_DIR=`cd "$BASE_DIR" && pwd`
#echo "collect master is at $BASE_DIR"
fi
source $BASE_DIR/bin/env.sh
AS_USER=`whoami`
LOG_DIR="$BASE_DIR/logs"
LOG_FILE="$LOG_DIR/server.log"
PID_DIR="$BASE_DIR/logs"
PID_FILE="$PID_DIR/.run.pid"
function running(){
if [ -f "$PID_FILE" ]; then
pid=$(cat "$PID_FILE")
process=`ps aux | grep " $pid " | grep -v grep`;
if [ "$process" == "" ]; then
return 1;
else
return 0;
fi
else
return 1
fi	
}
function start_server() {
if running; then
echo "$SERVER_NAME is running."
exit 1
fi
mkdir -p $PID_DIR
touch $LOG_FILE
mkdir -p $LOG_DIR
chown -R $AS_USER $PID_DIR
chown -R $AS_USER $LOG_DIR
echo "$JAVA $UEAP_JVM_ARGS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.port=$JMX_PORT $STARTUP_CLASS"
sleep 1
nohup $JAVA $UEAP_JVM_ARGS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.port=$JMX_PORT $STARTUP_CLASS 2>&1 >>$LOG_FILE &	
echo $! > $PID_FILE
chmod 755 $PID_FILE
sleep 1;
tail -F $LOG_FILE
}
function stop_server() {
if ! running; then
echo "$SERVER_NAME is not running."
exit 1
fi
count=0
pid=$(cat $PID_FILE)
while running;
do
let count=$count+1
echo "Stopping $SERVER_NAME $count times"
if [ $count -gt 5 ]; then
echo "kill -9 $pid"
kill -9 $pid
else
$JAVA $TOOLS_ARGS com.starit.ueap.common.shell.StopServerTool -host 127.0.0.1 -port $JMX_PORT $@
kill $pid
fi
sleep 3;
done	
echo "Stop $SERVER_NAME successfully." 
rm $PID_FILE
}
function status(){
if running; then
echo "$SERVER_NAME is running."
else
echo "$SERVER_NAME was stopped."  
fi
}
function help() {
echo "Usage: server.sh {start|status|stop|restart|reload}" >&2
echo "       start:             start the $SERVER_NAME server"
echo "       stop:              stop the $SERVER_NAME server"
echo "       restart:           restart the $SERVER_NAME server"
echo "       status:            get $SERVER_NAME current status,running or stopped."
}
command=$1
shift 1
case $command in
start)
start_server $@;
;;    
stop)
stop_server $@;
;;
status)
status $@;
;; 
restart)
$0 stop $@
$0 start $@
;;
help)
help;
;;
*)
help;
exit 1;
;;
esac

 4:执行mvn install或者mvn package 可以再target生成tar.gz后缀文件。提交到linux系统,解压缩即可运行。(不考虑window环境)

 

  • 大小: 37 KB
  • 查看图片附件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不错的自学网站合集

一、网站类1、假期在家如何查找论文资料&#xff1f;只需登录中国图书馆http://t.cn/hYmDq&#xff08;需注册&#xff09;&#xff0c;即可免费下载各种期刊和学位论文2、全球免费开放的电子图书馆http://t.cn/h4hJUf3、给大家推荐个神网站&#xff0c;只要是外文书籍基本上都…

c++中关于字符串的读入——cin、getline、get、gtes(查询+思考+总结)

1、cin读入一个字符&#xff1a;char c;cin>>c;2、cin读入一个字符串&#xff1a;char s[10];cin >> s;&#xff08;c风格字符串&#xff09; string str;cin >> str;&#xff08;c的string&#xff09;3、cin.get()读入一个字符&#xff1a;char c;ccin.…

java文档注释和标题注释_Java注释:探究和解释

java文档注释和标题注释Java 5 SE的许多出色功能之一是Annotations构造的引入。 注释是一些标签&#xff0c;可以将其插入到程序源代码中&#xff0c;以使用某种工具对其进行处理并使其变得有意义。 注释处理工具通常使用&#xff08;Java 5 SE的&#xff09;Reflection API在J…

shell 脚本初步,启动可执行 jar 文件

可能很多同学在看到这篇文章的时候是第一次接触 shell 脚本。所以我们首先需要了解什么是 shell 脚本。在 Windows 里我们经常会看到一种扩展名为 .bat 的文件&#xff0c;它称为批处理文件。批处理文件的作用是把许多个命令放在一个文件里&#xff0c;当运行这个文件的时候就执…

使用Java创建DynamoDB表

在这篇文章中&#xff0c;我们将使用java方法在DynamoDB数据库上创建表。 在开始之前&#xff0c;我们需要安装本地dynamodb&#xff0c;因为我们要避免使用dynamodb的任何费用。 有一个以前的岗位上本地dynamodb。 如果您使用docker&#xff0c;则可以找到本地dynamodb映像&a…

表达式前后缀表达形式 [zz]

(2012-09-12 13:08:39) 转载▼标签&#xff1a; 杂谈 转自&#xff1a;http://blog.csdn.net/whatforever/article/details/673853835,15,,80,70,-,*,20,/ //后缀表达方式(((3515)*(80-70))/20&#xff09;25 //中缀表达方式 /,*,,35,15,-,80,70, 2…

引用:初探Sql Server 执行计划及Sql查询优化

引用:初探Sql Server 执行计划及Sql查询优化 原文:引用:初探Sql Server 执行计划及Sql查询优化初探Sql Server 执行计划及Sql查询优化 收藏MSSQL优化之————探索MSSQL执行计划作者&#xff1a;no_mIss最近总想整理下对MSSQL的一些理解与感悟&#xff0c;却一直没有心思和时间…

Cities

问题 C: Cities 时间限制: 1 Sec 内存限制: 128 MB提交: 87 解决: 61[提交][状态][讨论版][命题人:admin]题目描述 There are n cities in Byteland, and the ith city has a value ai. The cost of building a bidirectional road between two cities is the sum of their v…

spring观察者模式_Spring事件的观察者模式

spring观察者模式介绍 观察者模式的本质是“定义对象之间的一对多依赖关系&#xff0c;以便当一个对象改变状态时&#xff0c;其所有依赖关系都会被通知并自动更新”。 GoF。 观察者模式是发布/订阅模式的子集&#xff0c;它允许许多观察者对象查看事件。 可以在不同的情况下使…

Lombok,自动值和不可变项

我喜欢布兰登&#xff08;Brandon &#xff09;在博客文章中比较Project Lombok &#xff0c; AutoValue和Immutables的建议 &#xff0c;而这篇文章试图做到这一点。 我已经简要概述了Project Lombok &#xff0c; AutoValue和Immutables &#xff0c;但是这篇文章有所不同&am…

linux对于zombie的处理

(Linux基础)[僵尸进程处理] 今天在服务器上推送项目的时候&#xff0c;突然发现很卡。就用top查看了一下&#xff0c;果然此事不简单啊。 top - 10:39:16 up 20 days, 23:11, 2 users, load average: 1.13, 1.09, 1.03 Tasks: 204 total, 2 running, 196 sleeping, 1 sto…

POJ - 1847 Tram(dijkstra)

题意&#xff1a;有向图有N个点&#xff0c;当电车进入交叉口&#xff08;某点&#xff09;时&#xff0c;它只能在开关指向的方向离开。 如果驾驶员想要采取其他方式&#xff0c;他/她必须手动更换开关。当驾驶员从路口A驶向路口B时&#xff0c;他/她尝试选择将他/她不得不手动…

用interrupt()中断Java线程

Javathread 最近在学习Java线程相关的东西&#xff0c;和大家分享一下&#xff0c;有错误之处欢迎大家指正&#xff0e; 假如我们有一个任务如下&#xff0c;交给一个Java线程来执行&#xff0c;如何才能保证调用interrupt()来中断它呢&#xff1f; Java代码 class ATask imple…

activemq和jms_保证主题,JMS规范和ActiveMQ的消息传递

activemq和jms最近&#xff0c;一位客户要求我仔细研究ActiveMQ的“持久”消息的实现&#xff0c;它如何应用于主题以及在存在非持久订户的故障转移方案中会发生什么。 我已经了解到&#xff0c;JMS语义规定&#xff0c;即使面对消息代理提供程序故障&#xff0c;也只能保证主题…

JAVA分代收集机制详解

Java堆中是JVM管理的最大一块内存空间。主要存放对象实例。在JAVA中堆被分为两块区域&#xff1a;新生代&#xff08;young&#xff09;、老年代&#xff08;old&#xff09;。堆大小新生代老年代&#xff1b;&#xff08;新生代占堆空间的1/3、老年代占堆空间2/3&#xff09;新…

FizzBu​​zz Kata与Java流

在柔道练习仅几周之后&#xff0c;我的儿子感到无聊。 他抱怨说自己没有学任何东西&#xff0c;因为他一遍又一遍地做着同样的事情。 混淆学习和做新事物的不仅仅是幼儿。 例如&#xff0c;有多少软件开发人员通过执行kata或参加dojos来进行刻意练习的麻烦&#xff1f; 重复您…

高可用架构

转载于:https://www.cnblogs.com/138026310/p/9088341.html

vc6.0快捷键

2010-09-14 17:46 F1 显示帮助,如果光标停在代码的某个字符上,显示MSDN中相应的帮助内容&#xff08;需要安装MSDN才能使用&#xff09; F2 书签功能: CtrlF2 --在某行设置一个书签(再按一次是取消) F2 --跳到下一个书签位置 ShiftF2 --跳到上一个书签位置 CtrlShiftF2 --删除…

ES6 各浏览器支持情况

http://kangax.github.io/compat-table/es6/转载于:https://www.cnblogs.com/likwin/p/9091008.html

MFC删除类的小窍门

VC 并没有提供删除一个类的简洁方法&#xff0c;我们需要手工删除&#xff0c;但过程并不复杂。例如&#xff0c;我们有一个 CMyButton 的类&#xff0c;对应的文件为 MyButton.h 和 MyButton.cpp &#xff0c;我们先到工程目录中删除这两个文件&#xff0c;此时该类信息自动从…