一.需求
如何将一个java web项目传给别人?放到github上.要想放到github上,就要学会git,markdown和maven.像那些jar包是不鼓励传到github上的,应该尽量把源文件等文本文件传上去,所以要把依赖写在pom.xml中.要让别人能够重复你的工作,使用git,maven这套体系,别人只需要clone一下,mvn package一下,从target目录中把war包取出来,略微配置一下就可以用了.这个过程多么简洁美好.所以以后建项目应该尽量脱离IDE,尽量使用maven,gradle等构建工具.它们能使程序便于移植.
二.Cannot change version of project facet Dynamic Web Module to 3.1.
这是一种类似破解软件的解决方案,打开window/show view/navigator/.settings/org.eclipse.wst.common.project.facet.core.xml,将其中的jst.web改为3.1.至于到底改成哪个版本,这需要跟web.xml保持一致,在web.xml中是这么定义webapp版本的
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
实际上,这种方法并没有从根本上解决问题,这个问题好像是eclipse的bug.
三.maven compile
maven会使用maven-compiler-plugin
来进行编译,这个插件默认的source
(源文件API版本)和target
(生成的jar包的运行环境)都是1.5,所以就需要手动更改一下这个插件的一些属性.
<project>
[...]
<build>
[...]
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
[...]
</build>
[...]
</project>
四.archetype-webapp
在eclipse中新建maven项目,选择archtype为webapp类型.如果报错说maven插件有问题,
Could not calculate build plan: Plugin org.apache.maven.plugins:maven-war-plugin:2.1.1 or one of
解决方案:进入~/.m2/org/apache/maven/plugins目录,将其下面的文件全部删除.maven自己会重新下载这些插件,下载的新插件就比较正常.
生成的项目目录结构如下:
├─src
│ ├─main
│ │ ├─java
│ │ ├─resources
│ │ └─webapp
│ │ └─WEB-INF
│ └─test
│ └─java
└─target
五.写完pom.xml之后
写完pom.xml之后,就开始下载一些库了,会发现在eclipse中下载特别慢.解决方案是,打开工程目录,手动执行mvn package命令,这是就会在控制台下下载库,速度比较快.
七.mvn package
在eclipse里面是buildpath-library添加了server runtime之tomcat依赖,但这件事是依赖eclipse的,maven可不知道关于tomcat的信息.执行mvn package
会报错找不到javax.servlet等一些库.
实际上,tomcat也不过是一对jar包,它也是一种依赖,需要在pom.xml中添加dependency
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>8.5.6</version>
</dependency>
这样一来,就可以mvn package
,去target目录下寻找war包了.随便一改pom.xml中的tomcat版本就可以生成不同版本tomcat下的war包,大大增强了程序的可移植性.
八.mysql数据库表名的大小写问题
Linux下的MySQL默认是区分表名大小写的,通过如下设置,可以让MySQL不区分表名大小写:
- 用root登录,修改 /etc/my.cnf;
- 在[mysqld]节点下,加入一行: lower_case_table_names=1
- 重启MySQL即可;
其中 lower_case_table_names=1 参数缺省地在 Windows 中这个选项为 1,在Unix中为0.
九.mysql时区问题
The server time zone value 'AEST' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
这个问题是mysql-connector 6.x出现的问题,换成老版本就不存在这个问题了.另一种解决方案是:
jdbc:mysql://localhost:3306/test?serverTimezone=America/New_York,时区可以改成中国的serverTimezone=Asia/Shanghai.
想要查看有哪些时区,运行如下代码:
import java.util.Arrays;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) {
Arrays.asList(TimeZone.getAvailableIDs()).forEach(System.out::println);
}
}
十.在eclipse中建立web项目属性常常需要更改的地方
1.项目右键属性>facet>添加dynamyc web
eclipse中可以新建各种类型的项目,如dynamic web,static web,maven project,这些项目其实就相当于模板.可以通过facet来给项目添加一些属性集.
2.deployment assembly,部署时需要设置那些文件,需要把哪些库导出
3.compiler设置一下compliance
4.build path添加library>server runtime
十一.在intelliJ中新建maven archetype-webapp速度奇慢
这是因为默认情况下,都去服务器上下载archetype,下载速度比较慢.解决方案有两种:
- 在创建Maven项目时加上 archetypeCatalog=internal 参数
- 在maven的VM Options加上-DarchetypeCatalog=internal参数
这个问题解释如下
archetypeCatalog表示插件使用的archetype元数据,不加这个参数时默认为remote,local,即中央仓库archetype元数据,由于中央仓库的archetype太多了,所以导致很慢,指定internal来表示仅使用内部元数据
第一种方法只能在这一次生效,第二种方法能永远生效.
十二.eclipse中的tomcat服务器webapp的位置
$WORKSPACE.metadata.pluginsorg.eclipse.wst.server.core
当遇到部署问题时,可能是因为tomcat过去的部署影响了现在的正常部署.
- 解决方案一,server视图下将tomcat clean一下.
- 解决方案二,进入上述目录清空一下这个文件夹
十三.maven缺少包,本地已经缓存一部分,需要强制更新
mvn clean compile install -e -U
总结
对于以上这种bug,通过它们的解决方案可以找到一些规律:
- 清空一下
- 重启一下
- 属性改一下
- 把异常复制粘贴,百度一下,stackOverflow上的通常是正解
像这些bug,有的是历史遗留问题,有的是各大组织代码不协调不一致问题,有的问题是默认配置太坑不够人性化.这些问题本身都是很没意义的,与其研究它们,不如学些别的有用的知识.然而,如果你能快速解决这些细节犄角旮旯的小问题,你就会被人称为"厉害".
老子曰:盖闻善摄生者,路行不遇兕虎,入军不被甲兵;兕无所投其角,虎无所措其爪,兵无所容其刃。夫何故?以其无死地。
但愿我能时时刻刻走在正确的平坦的大路上.