一:实践一次这样的操作有助于理解Tomcat/Eclipse的启动原理,包括classpath的设置,option的配置等等;
二:通过Bash终端创建一个简单的Java项目(单项目单Module,如果是IDEA的多Module可以创建一个Proj,然后内部再创建Module,这时候Module就类似这里的Proj,但是编译和运行的pwd应该为Proj而非Module)
1.cd到工作空间,个人是:cd /home/silentdoer/TerminalProjs/JavaProjs;然后执行mkdir FirstTerminalProj创建第一个终端项目;
2.cd到FirstTerminalProj里,通过mkdir -p src/me/silentdoer/terminalprojtest classes同时创建src和classes目录,并创建src的包路径,然后通过touch src/me/silentdoer/terminalprojtest/Entrance.java创建一个java文件(后缀其实可以任意或不要);
3.vim ./me/silentdoer/terminalprojtest/Entrance.java;开始写简单代码;
4.第一步先写package me.silentdoer.terminalprojtest;之后便是写Entrance类和main方法;
5.把Entrance.java写好后保存退出,此时pwd在FirstTerminalProj目录里;
6.用javac src/me/silentdoer/terminalprojtest/Entrance.java -d classes命令将该文件编译到对应的目标目录,javac会自动在目标目录内创建与该类包路径对应的目录路径然后生成 类名.class文件;
7.用java -cp classes me.silentdoer.terminalprojtest.Entrance(这里可接参数列表)来运行me.silentdoer.terminalprojtest.Entrance类;注意这里是运行这个类,如果没有指定-cp则jvm会以CLASSPATH的为准去搜索这个类然后执行;
8.运行jar包的方法为java -jar xx.jar(接参数列表),注意这里是需要有.jar后缀的,因为jar包实际上还可以是zip包,它不像.class一样是固定的;
总结:
javac里的-classpath或-cp是用来指定java源文件中(不一定要.java结尾,就像shell脚本不一定要.sh一样,编译后自动是.class)引用的jar包或其它module的classes目录(即Module依赖另一个Module),否则javac发现引用的东西不存在会编译失败(这也是为什么看框架源码要将编译方式由javac换成eclipse的原因);
1.可通过-d xx/classes指定编译输出目录;注意javac可以编译任何路径下的源文件而不需要此文件在对应的目录结构下(已经经过测试确实是这样),但是运行.class则需要在对应的目录结构下(即包路径和目录路径一致,这是因为运行某个类实际上不是去运行而是告诉jvm我要运行哪个类,然后jvm去classpath里搜索)
2.可以javac ./src/me/silentdoer/terminaltestproj/Entrance.java -d ./classes来编译,最后自动生成完整的与包对应的目录和.class文件在classes中;
3.如果要一次性编译目录下所有的文件可以用:查了下也测试了似乎只能编译某个包下的所有文件用如me/silentdoer/test01/*.java实现;(最终想了下还是用shell脚本实现吧,就是传递两个参数,src路径和classes路径,然后shell遍历src下所有的目录通过cd $dir和cd ..实现转接到不同目录然后通过javac ./*.java -d classes来实现编译所有的.java文件[这时候后缀的好处体现出来了,虽然并不要求必须是.java],编译方式类似:javac src/me/silentdoer/terminalprojtest/*.java -d classes),这里不需要用到-sourcepath,目前不知道这个有什么用。
1)java运行字节码文件则要求提供-cp为classes目录,用java -cp ./classes me.silentdoer.terminalprojtest.Entrance即可运行;注意这里之所以不需要.class是因为javac是为了查找要编译的文件跟后缀无关,而所有的编译好的都叫XX.class,因此字节码文件后缀唯一而源文件后缀任意,所以运行时不需要附带.class;
2)如果运行的项目需要用到其它jar包或引用了其它module,则应该是java -cp ./classes:xx/other-module-classes:xx/XX.jar。。。这样子引用其它module和jar包;
3)java命令还可以指定JVM的其它参数,如java -cp ./classes-server -d64 -Dmypro=33 me.silentdoer.terminalprojtest.Entrance等等,这里-server表示jvm以server模式执行,-d64表示以64位数据模式执行[需要安装的是64位jre],-Dmypro=33表示在系统参数里添加key-value为mypro=33;
4)经常用来优化jvm和配置全局变量的参数:
1.-server,如tomcat启动时会指定;
2.-d64,只要安装的是64位的最好指定;
3.Dmypro=33,如tomcat启动时会指定DCATALINA_HOME=xxx等等
4.-Xms设定此jvm实例的初始的堆大小(内存)也是最小大小,使用方式为-Xms256m,即这个jvm在启动后就会从操作系统那申请256兆的内存;(单位包括k即kb,m即兆,g为G,应该没有byte单位的)
5.-Xmx设定此jvm实例最多可以从操作系统那里申请多少的内存,使用方式为-Xmx2048m,则当随着对应java app需要的内存越多此jvm实例会继续像操作系统申请内存,但不超过2048m;如果java app的需求超过了这个值就会报outofmemory异常;
6.-Xss设定jvm为对应java app每个启动线程分配的大小,jdk1.5以后是1M
这里java.lang.Runtime类中的 freeMemory(), totalMemory(), maxMemory()的输出和上面的配置有莫大关系,maxMemory获得此jvm实例设置的-Xmx大小,而totalMemory则是获得当前从操作系统中请求到的内存大小,freeMemory则是此jvm实例请求了多少内存但是没用上的;
如果没有配置-Xms则jvm实例是一点一点的从操作系统里申请内存的,即基本上用到多少申请多少,因而一定程序上影响jvm的性能,但是freeMemory会很小;而如果一开始就设置-Xms为一个较大的值,则对应java app一开始的freeMemory是会比较大的
,但是随着业务的进行freeMemory会波动,而且要用到内存可以立刻使用而不用等操作系统去分配;(输出的totalMemory会比jvm请求分配的略小,因为jvm自己也需要占用内存,这也是java程序比系统原生程序要慢的原因之一)
重要:这些参数都要在xxx.Entrance之前指定而不能放在后面,即java -cp ./ demo.Test -server -d64 -Xms1024m是错误的,要放在demo.Test的前面,至少我这里1.8测试是这样的;
以上的配置要符合条件,比如你只有4G内存却设置-Xms20480m显然是有问题的,也不能设置满,毕竟操作系统还要运行其它进程而且也未必给jvm实例这么多内存;
github上创建java项目简单操作
github上创建java项目简单操作 参考L: github上创建java项目简单操作 - CSDN博客 ...
使用Maven创建Java项目
在本教程中,我们将向你展示如何使用 Maven 来创建一个 Java 项目,导入其到Eclipse IDE,并打包 Java 项目到一个 JAR 文件. 所需要的工具: Maven 3.3.3 Ecl ...
Maven学习(十)-----使用Maven创建Java项目
所需要的工具: Maven 3.3.3 Eclipse 4.2 JDK 8 注意:请确保 Maven 是正确安装和配置(在Windows,*nix,Mac OSX系统中),然后再开始本教程,避免 mv ...
maven 学习---使用Maven创建Java项目
在本教程中,我们将向你展示如何使用 Maven 来创建一个 Java 项目,导入其到Eclipse IDE,并打包 Java 项目到一个 JAR 文件. 所需要的工具: Maven 3.3.3 Ecl ...
Java开发环境的搭建以及使用eclipse从头一步步创建java项目
一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...
java第一天--Java开发环境的搭建以及使用eclipse从头一步步创建java项目
一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...
搭建一套Java开发环境以及使用eclipse从头一步步创建java项目
一.java 开发环境的搭建 在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载JDK. https://www.oracle.com/tech ...
Linux巩固记录(2) java项目的编译和执行
由于要近期使用hadoop等进行相关任务执行,操作linux时候就多了 以前只在linux上配置J2EE项目执行环境,无非配置下jdk,部署tomcat,再通过docker或者jenkins自动部署上 ...
Eclipse 创建 Java 项目
打开新建 Java 项目向导 通过新建 Java 项目向导可以很容易的创建 Java 项目.打开向导的途径有: 通过点击 "File" 菜单然后选择 New > Java P ...
随机推荐
[NOIP2016]愤怒的小鸟
题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...
DEBUG测试
这几天看一个ros软路由的的API借口的C++实现看到一个关于DEBUG的测试,第一次见,感觉挺实用的,记录一下: #include #include
spring-boot 整合redis作为数据缓存
添加依赖 org.springframework.bootsp ...
jstl c标签 ”test does not support runtime expressions“
将jstl 的uri (没有 ...
PHP取微信access_token并全局存储与更新
来源:http://www.zcphp.com/html/weixinkaifa-show-20.html 官方的说明: access_token是公众号的全局唯一票据,公众号调用各接口时都需使用ac ...
Php的基本语法学习
1.php语法 当 PHP 解析一个文件时,会寻找开始和结束标记,标记告诉 PHP 开始和停止解释其中的代码. 1)标记语法 是以<?php 开头,?> 结束,相当于html标签的开始标签 ...
JAVA NIO:Buffer.mark()的用法
在默认情况下,Buffer.mark()并没有什么用处,既不会影响Buffer的遍历,也不会影响Buffer的位置统计函数,如remaining()函数,能影响这些操作的行为只有position(). ...
mvn打包spring工程成jar时报Unable to locate Spring NamespaceHandler for XML schema namespace错误解决办法
有一个小工程,使用了spring,在使用maven的assembly打包成独立可执行的jar包后,在执行时报如下错误:Configuration problem: Unable to locate S ...
`ECS弹性计算服务
云服务器(Elastic Compute Service 简称ECS)是一种简单高效,处理能力可弹性伸缩的计算服务.能快速构建更稳定.安全的应用,提升运维效率,降低IT成本. 云服务器ecs作用如下: ...
ACM -- 算法小结(十)素数的两种打表法
素数的两种打表法 下面介绍两种素数打表法,由于是两年前留下的笔记,所以没有原创链接~~ @_@!! 第一种疯狂打表法: #include #include