代码改变世界

Maven开发环境的搭建,含jetty调试[简单明了]

2015-09-22 14:50  chen.simon  阅读(1994)  评论(0)    收藏  举报

之前的一片老文,搬过来。

1. Maven的开发环境需要哪些部件
a) Maven。
去http://maven.apache.org/ 下载。将其bin目录加入进系统PATH。测试方法:用命令mvn –version。

maven开发环境的搭建_chenxiaguang_20140414.docx-Microsoft-Word_2014-04-14-15-57-44
b) m2eclipse插件(可选)。
如果你习惯命令行的方式用maven,可以忽略。在线安装的site为http://download.eclipse.org/technology/m2e/releases/1.4 如果你在安装插件过程中因某些原因导致下载或安装失败,请寻找安装了m2eclipse的eclipse包。一般来讲安装m2eclipse插件的时候,会需要依赖一些其他的插件,然而部分这些被依赖的插件,又恰巧会不幸下载失败,导致了m2eclipse插件安装的时候失败的可能性比较大。所以建议全程FQ。
c) 私服。
这里以nexus为例子。
i. 为什么要私服
1. 针对项目组不能直接连接外网或者不能直接从外网下载jar的情况,私服可以充当一个代理的角色。
2. 部分你所依赖的jar因为某些原因不在中央仓库。比如oracle的JDBC驱动就因版权问题不在中央仓库。所以你要自己将ODBC维护在你的私服上。
3. 项目组内多小组使用maven开发,小组之间的jar又存在依赖关系。私服可以用来发布小组的jar提供给其他小组依赖。
ii. 怎么部署nexus
1. 去http://download.sonatype.com/nexus/oss/nexus-2.8.0-05-bundle.zip 下载。如无法下载,请去http://www.sonatype.org/nexus/go 寻找新的下载链接。如果你有tomcat服务器可以直接下载他的war来部署。
2. 注意:目前的nexus新版本需要JDK7+。第一次使用需要安装: 去nexus-2.6.0-05-bundle\nexus-2.6.0-05\bin目录下 nexus.bat install(注意如果是win7用户,需要用管理员方式启动cmd。否则权限不够,下同)
3. 启动 nexus.bat start
4. 需要修改端口号的:修改conf/ nexus.properties文件中application-port字段即可。如果是war包部署的,直接修改tomcat的端口号。Orz.
5. 访问http://localhost:8081/nexus 管理员的用户名和密码是 admin/admin123

2. Maven工程的创建及目录结构的介绍
a) 使用之前先配置eclipse中的maven插件
Window/Preferences/Maven/Installations add 你自己安装的maven,不要用插件自带的。继续修改User Settings,选择你自己maven的conf目录下的settings.xml文件。
b) 修改settings文件。
就在a步骤中配置settings文件路径的地方,有open file,这样就在eclipse中打开了settings.xml文件,找到mirrors标签,加上镜像配置,修改后类似下面所示:

<mirrors>
     <mirror>
         <id>internal_repo</id>
         <name>Internal Repo Manager</name>
         <url>http://localhost:8081/nexus/content/groups/public</url>
         <mirrorOf>central</mirrorOf>
     </mirror>
  </mirrors>

Localhost就是你部署nexus的私服的地址,根据自己的实际情况,自行修改。
c) 创建工程
使用eclipse的向导new/Maven project/next/next/填写GroupId(例如org.simonme),artifact ID 如demo1,package 如org.simonme.demo1,finish。
d) 增加依赖的jar
比如以开发者需要依赖apache的common lang3。用google搜索关键字maven apache common lang,即可以找到 http://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.0 这个链接,进去查看,将maven页签下的依赖信息复制下来直接贴到工程的pom.xml dependencies中。此时观看工程左边的maven依赖库就能看common lang已经被自动加入进工程的classpath中。如下图:

Java-EE-demo1_pom.xml-Eclipse_2014-04-14-16-42-35
在App.java中用代码测试下

package org.simonme.demo1;

import org.apache.commons.lang3.StringUtils;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        System.out.println(StringUtils.isEmpty(""));
    }
}

没问题能正常运行。
e) 在工程上右击, Run as/Maven test
这样可以将整个工程编译并运行单元测试。
f) 如果要创建一个web工程
修改pom.xml的jar成war
g) 对工程打包
在命令行中,去工程的目录下,mvn clean package。还可以跳过单元测试进行打包,加上-Dmaven.test.skip=true即可。
3. 在私服上上传jar
这种情况主要针对中央仓库没有你要的jar。
http://localhost:8081/nexus admin登陆后,点击左边的Repositories,选择右上3rd party仓库,不要选其他仓库,选择右下的Artifact Upload,GAV Definition: 选择From POM,选择你要上传jar的pom文件(如果你没有,可以去网上搜索),上传你的jar。
4. 关联source和doc
当你在写代码的时候需要看哪个类的代码的时候,f3以后,代码jar会被自动下载和关联上来,方便的很。(第一次按,会有点慢,注意eclipse的右下角,Download source…)
如果maven没有自动下载源码jar或者javadoc jar:
先检查是否在首选项中开启了这个功能
2015-09-23 09-36-43_Preferences

若是还是下载不了的。可以尝试下面这个办法:
那就去你的本地仓库 删除.lastUpdated结尾的文件!!

本地仓库我用的是默认的C:\Users\chenxiaguang\.m2\repository

然后执行下面的命令
mvn dependency:resolve -Dclassifier=javadoc -U
mvn dependency:resolve -Dclassifier=source  -U

执行成功后类似这样:
pg5rlomr.2t1

有时候这个办法也不行,可以重启eclipse后依靠m2eclipse的自动source jar的功能试试。

这个问题我目前还没时间去彻底调查清楚。


5. 用jetty调试工程
参见 http://hi.baidu.com/yyjt1987/item/f55a2ab1538cc8d184dd79ad 图文并茂,经验证可用。

百度空间关闭了,上面的链接用不了,重新贴一个写的比较详细的,图文并茂的maven工程开启jetty调试 http://czj4451.iteye.com/blog/1942437

 

6. eclipse中jar不能自动下载问题

在eclipse中创建了新的maven工程后,修改pom增加需要依赖的jar,在增加jar依赖时,经常出现jar包不能自动下载,导致编译出错。

解决办法:
在命令行执行mvn clean install
然后在eclipse中右击工程maven/update project

7. war包的问题

在pom文件中增加war插件依赖

<build>
        <filters>
            <!-- 过滤文件,通常是一个属性文件(名值对的形式) -->
            <!-- <filter>src/main/webapp/META-INF/auto-config.properties</filter> -->
            <!-- <filter>${user.home}/antx.properties</filter> -->
        </filters>
        <finalName>hibernate_demo</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <!-- 打包之前过滤掉不想要被打进 .war包的jar,注意:这个地方,本来路径应该是 WEB-INF/lib/anaalyzer-2.0.4.jar,但是经过多次试验,不能这样,至于咋回事儿,搞不清楚。。经多方查证均无结果 
                        暂且这样吧,虽然显得很丑陋,但是总能解决问题吧 -->
                    <warSourceExcludes>*/lib/analyzer-2.0.4.jar</warSourceExcludes>
                    <webResources>
                        <resource>
                            <!-- 元配置文件的目录,相对于pom.xml文件的路径 -->
                            <directory>src/main/webapp/WEB-INF</directory>

                            <!-- 是否过滤文件,也就是是否启动auto-config的功能 -->
                            <filtering>true</filtering>

                            <!-- 目标路径 -->
                            <targetPath>WEB-INF</targetPath>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

8.Maven项目编译后classes文件中没有.xml问题

参见 http://www.cnblogs.com/wbb2109/p/3999247.html

在pom的build标签内加一段配置即可

<resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>

其实出现这个问题是由于不规范造成的,按maven的目录规划,xml属于资源文件,需要将其放到resource下,这样的mvn在编译的时候会自动将其copy到clasess中

2015-09-25 10-25-54_Plug-in Development - Eclipse SDK

当你按规范的去放置文件后,就需要将上面的resources配置去掉了

9. 添加只用于测试期或者编译期的jar

有时候我们需要添加只用于编译期的jar,比如servlet的jar
或者只用于测试的比如 junit的
怎么做,用scope就可以了

<!-- 添加Servlet -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>

在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:
    * compile,缺省值,适用于所有阶段,会随着项目一起发布。
    * provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
    * runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
    * test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
    * system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

10. 打出来的war包中的classes中没有文件

1) 检查src/main下是否有java类或者资源文件,打war包时,mvn是不会将test下的类或者资源打进war包的!!

11. 打包时跳过单元测试

mvn package -Dmaven.test.skip=true

12. 打包时在命令行中指定编译用的JDK版本

mvn package -Dmaven.compiler.source=1.8 -Dmaven.compiler.target=1.8

13. 带上依赖jar的打包

 1     <build>
 2         <plugins>
 3             <plugin>
 4                 <groupId>org.apache.maven.plugins</groupId>
 5                 <artifactId>maven-assembly-plugin</artifactId>
 6                 <version>2.4</version>
 7                 <configuration>
 8                     <finalName>TestLegionStore</finalName>
 9                     <appendAssemblyId>false</appendAssemblyId>
10                     <descriptorRefs>
11                         <descriptorRef>jar-with-dependencies</descriptorRef> <!-- 内置配置:这里使用的是jar-with-dependencies -->
12                     </descriptorRefs>
13                     <archive>
14                         <manifest>
15                             <mainClass>com.ss.middleware.TestLegionStore</mainClass>
16                         </manifest>
17                     </archive>
18                 </configuration>
19                 <executions>
20                     <execution>
21                         <phase>package</phase>
22                         <goals>
23                             <goal>single</goal>
24                         </goals>
25                     </execution>
26                 </executions>
27             </plugin>
28 
29         </plugins>
30     </build>

 

14. 在POM中指定编译用的JDK版本

 1     <build>
 2         <plugins>
 3             <!-- 指定jdk版本 -->
 4             <plugin>
 5                 <groupId>org.apache.maven.plugins</groupId>
 6                 <artifactId>maven-compiler-plugin</artifactId>
 7                 <version>3.1</version>
 8                 <configuration>
 9                     <!-- 源码的编译器版本 -->
10                     <source>1.7</source>
11                     <!-- class的编译器版本 -->
12                     <target>1.7</target>
13                     <encoding>UTF-8</encoding>
14                 </configuration>
15             </plugin>
16         </plugins>
17     </build>