一.需求

如何将一个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不区分表名大小写:

  1. 用root登录,修改 /etc/my.cnf;
  2. 在[mysqld]节点下,加入一行: lower_case_table_names=1
  3. 重启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,下载速度比较慢.解决方案有两种:

  1. 在创建Maven项目时加上 archetypeCatalog=internal 参数
  2. 在maven的VM Options加上-DarchetypeCatalog=internal参数

这个问题解释如下

archetypeCatalog表示插件使用的archetype元数据,不加这个参数时默认为remote,local,即中央仓库archetype元数据,由于中央仓库的archetype太多了,所以导致很慢,指定internal来表示仅使用内部元数据

第一种方法只能在这一次生效,第二种方法能永远生效.

十二.eclipse中的tomcat服务器webapp的位置

$WORKSPACE\.metadata\.plugins\org.eclipse.wst.server.core
当遇到部署问题时,可能是因为tomcat过去的部署影响了现在的正常部署.

  • 解决方案一,server视图下将tomcat clean一下.
  • 解决方案二,进入上述目录清空一下这个文件夹

十三.maven缺少包,本地已经缓存一部分,需要强制更新

mvn clean compile install -e -U

总结

对于以上这种bug,通过它们的解决方案可以找到一些规律:

  • 清空一下
  • 重启一下
  • 属性改一下
  • 把异常复制粘贴,百度一下,stackOverflow上的通常是正解

像这些bug,有的是历史遗留问题,有的是各大组织代码不协调不一致问题,有的问题是默认配置太坑不够人性化.这些问题本身都是很没意义的,与其研究它们,不如学些别的有用的知识.然而,如果你能快速解决这些细节犄角旮旯的小问题,你就会被人称为"厉害".

老子曰:盖闻善摄生者,路行不遇兕虎,入军不被甲兵;兕无所投其角,虎无所措其爪,兵无所容其刃。夫何故?以其无死地。

但愿我能时时刻刻走在正确的平坦的大路上.

maven webapp栽坑录的更多相关文章

  1. 创建maven工程时总是带有后缀名Maven Webapp解决办法

    做项目时突然遇到了一个新问题,从前没有的,今天不知怎么了突然有了这个问题,maven创建web项目时多出了后缀名maven webapp ,很碍眼,而且访问路径还得删了,这个后缀名才可访问,所以找了答 ...

  2. MyEclipse10建立Maven Webapp项目并通过git传到GitHub

    先创建Maven Webapp项目 图文详解MyEclipse中新建Maven webapp项目的步骤(很详细) 在web项目的路径中右键(前提是你机器已经装了git)“Git Init Here”, ...

  3. 于Heroku平台部署maven webapp(java web)工程

    眼下,需要Heroku上述部署java web工程,该项目必须使用maven管理 一:新maven webapp工程 编者pom.xml档,增加下面的配置为例, <project xmlns=& ...

  4. webapp填坑记录[更新中]

    网上也有许多的 webapp 填坑记录了,这几个月,我在公司正好也做了2个,碰到了一些问题,所以我在这里记录一下我所碰到的问题: meta 头部声明在开发的时候,刚刚创建 HTML 文件,再使用浏览器 ...

  5. 在eclipse中创建maven webapp项目时弹出错误-解决办法

    在eclipse中创建maven webapp项目时报错: Could not resolve archetype org.apache.maven.archetypes:maven-archetyp ...

  6. webapp填坑记录

    网上也有许多的 webapp 填坑记录了,这几个月,我在公司正好也做了2个,碰到了一些问题,所以我在这里记录一下我所碰到的问题: meta 头部声明在开发的时候,刚刚创建 HTML 文件,再使用浏览器 ...

  7. 参照实验室这边案例做一个简单的maven webapp项目

    流程 : 首先写出一个简单的前端页面. 之后写配置文件.dao.domain等等,注意这里可以使用generator进行自动配置 实验室这边配置文件如下: 其实主要的配置文件就分为6“个”. appl ...

  8. STS 创建 Maven 项目填坑

    用 STS 创建 Maven 项目并不复杂,只是其中有一些坑在里面,我在解决这些坑的时候发现很多人都遇到了相同的问题,因此把创建的步骤记录在这里.所有的步骤不外乎就是一些套路,并没有什么复杂的地方,只 ...

  9. jenkins集群节点构建maven(几乎是坑最多的)

    业务量变大时,单台的jenkins进行自动化构建部署,就显得没那么灵活,jenkins的集群并非像web服务器.mysql集群那样,jenkins的集群无需在额外的主机安装jenkins,但是用于ja ...

随机推荐

  1. 如何只用CSS做到完全居中

    我们都知道 margin:0 auto; 的样式能让元素水平居中,而 margin: auto; 却不能做到垂直居中--直到现在.但是,请注意!想让元素绝对居中,只需要声明元素高度,并且附加以下样式, ...

  2. [WinForm]WinForm跨线程UI操作常用控件类大全

    前言 在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作.不过会有一个问题:就是涉及到跨线程操作UI元素. 相信才开始接触的人一定会遇上这个问题. 为了解决这个问 ...

  3. WinForm拖动没有标题栏窗体的方法

    建立窗体的名称修改为:Form_HoverTree 文后附有源码下载. 主要代码: Point _HoverTreePosition; public Form_HoverTree() { Initia ...

  4. Socket初识

    基础概念 Socket,套接字,本质是网络编程接口.提供网络通信的能力,实现不同虚拟机或不同计算机之间的通信.面向客户/服务(C/S)模型,socket是应用层和传输层之间的中间软件抽象层: 顶上三层 ...

  5. Springl利用Aspectj的扩展实现Aop

    1. Spring为什么要使用Aspectj Spring Aop:Spring自己原生的Aop,只能用一个词来形容:难用. 你需要实现大量的接口,继承大量的类,所以spring aop一度被千夫所指 ...

  6. Springboot框架

    本片文章主要分享一下,Springboot框架为什么那么受欢迎以及如何搭建一个Springboot框架. 我们先了解一下Springboot是个什么东西,它是干什么用的.我是刚开始接触,查了很多资料, ...

  7. GJM : Unity3D HIAR -【 快速入门 】 七、使用本地识别包

    使用本地识别包 本文将向您介绍如何在 Unity 工程中使用本地识别包. Step 1.下载本地识别包 前往 HiAR 管理后台,上传您需要识别的图片并下载识别包,您可以获得一个 unitypacka ...

  8. IE 浏览器各个版本 JavaScript 支持情况一览表

    语言元素 语言元素 突发.IE6 标准.IE7 标准 IE8 标准 IE 9 标准 IE 10 标准 边缘 Windows 应用商店应用程序 __proto__ 属性 (Object) (JavaSc ...

  9. Android 5.X新特性之为RecyclerView添加下拉刷新和上拉加载及SwipeRefreshLayout实现原理

    RecyclerView已经写过两篇文章了,分别是Android 5.X新特性之RecyclerView基本解析及无限复用 和 Android 5.X新特性之为RecyclerView添加Header ...

  10. Android中使用Notification实现进度通知栏(Notification示例三)

    我们在使用APP的过程中,软件会偶尔提示我们进行版本更新,我们点击确认更新后,会在通知栏显示下载更新进度(已知长度的进度条)以及安装情况(不确定进度条),这就是我们今天要实现的功能.实现效果如下: 在 ...