maven webjar构建方法

用maven管理项目构建过程后,java部分已经有了很好的工程实践。但web静态资源仍处于复制粘贴的阶段,比较混乱。

看了一些前端工程化工具,比如webpack。但毕竟不是专职做前端的人员,感觉上手还不是那么容易。后来就找到了maven webjar这个方案。

maven webjar的大致历史貌似是,servlet 3.0规定jar包中META-INF/resources文件夹下的文件,可以作为静态资源被引用。所以就有人把常见的web库用这种方式搞成了jar包,这样的话,web静态资源也能像Java库一样被直接引用了。这位大神的官网地址在:

http://www.webjars.org/

顺着这个思路,把自己项目需要用到的静态资源也打成jar包。参考了一下webjar.org上的打包方式,源文件还是放在了src/main/resources下,在pom文件中,将这个resource目录配置到META-INF文件夹下。

[xml]

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<targetPath>META-INF/resources/</targetPath>
</resource>
</resources>
</build>

[/xml]

比如我有public文件夹,下面有something.js文件。项目的结果为:

src/main/resources

-public

–something.js

打成jar包后,jar包的结果为:

some.jar

-META-INF

–resources

—public

—-something.js

依赖该jar的web项目,可以通过http://ip:port/[projectname]/public/something.js访问到这个静态文件。

 

maven & eclipse工程实践

maven & eclipse source folder

eclipse中,可以在项目所属文件夹下点击右键-》Build path-》Mark as  a source folder

标记了source folder之后,eclipse就会将这个文件夹下的代码文件视作Java文件,并且在编译、运行时,将相应的源文件添加到class path中。在使用基于eclipse机制的各项功能或插件时,会将这些文件复制到java编译结果应该放到的文件中。例如,使用eclipse的tomcat插件的run on server功能时,标记为source folder的文件夹,Java文件将会被编译为class文件并拷贝到对应运行时web工程的WEB-INF/classes下,其余文件也会被原样复制到这个文件夹下。

一般的Dynaminc Web Project,eclipse会自动的将src目录设置为source folder。使用eclipse maven插件创建的maven webapp项目,会将main和test下的java和resource目录设置为source folder。

eclipse的maven插件会偶尔出现问题,设置不正确,可以手动调整。在实际需要中,如果有更灵活的需求,也可以手工调整。

maven&eclipse webapp

在eclipse下的web项目,使用tomcat插件运行时,会根据一定的规则,将项目的各个文件部署成为一个java web标准格式的包,由tomcat运行。

可以在项目属性的Deployment Assemble中,设置部署规则。/代表部署后的项目根目录,WEB-INF/classes代表项目部署后的Java及资源文件所在目录,一般设置这两个目录的需求比较多。

如果项目运行时出现一些诡异的问题,例如找不到某个类,或者某个配置文件读取错误,可以在此处查看,是否没有设置正确部署逻辑。

maven聚合项目 & eclipse

在eclipse中,创建maven project,勾选create a simple project,packagint选择pom,就可以创建一个聚合项目。

创建子项目时,可以选择maven module,父项目选择刚才建好的父项目,就可以将此项目设置为刚才项目的子项目。两个项目的pom文件,eclipse都会自动处理。用这种方式创建的子项目,文件位置会默认放到父项目文件夹下。

这样创建之后,父项目的文件夹中实际上也包含了子项目的文件,那么在eclipse的workspace中,实际上在父子两个项目中都存在同样的文件。如果需要将这个项目提交到svn,那么只能在父项目上做操作。

如果是一个已经创建好并上传至svn的maven聚合项目,签出父项目的同时也会将属于父项目文件夹中的子项目签出来。此时,就不能再手动签出子项目了,而是应该通过import-》existing project into workspace的方式,选择父项目路径下的子项目文件夹,逐个将子项目import进来,这样就可以正常进行开发。

做svn操作的时候,两个项目也会存在一定的冲突,最好统一在父项目上做操作。

maven profile

项目的不同发布方式,可能会使用不同的配置项目或者打包方式。

如果配置文件的大部分相同,只有少量配置不同,可以使用filter功能替换。

如果配置文件的整体都不相同,就可以在不同的profile中配置不同的resource目录。网上的资料大多是在src/main/resources下建立文件夹,在通用的build配置中exlude出去,再在各个profile中重新定义。我一般用重新定义与resources同级目录的方式。

maven profile & eclipse

一般会有一个用于开发的profile,常用的名称是dev或者development。此profile对应的resources目录,需要在eclipse中设置为source folder,才能够在run on server时正常部署。

如果使用了filter功能,那么配置文件的内容会变成${xxx},在eclipse中直接运行就会出错。此时,需要在项目属性的Maven设置中,添加需要的Active Maven profiles。添加之后,eclipse就会在运行的时候使用这个profile,正确的替换变量。

 

 

 

 

eclipse下建立maven项目

使用maven管理项目,主要想解决的是依赖管理,不用再去到处找jar包,尤其是有复杂依赖关系的时候,看着项目lib文件夹中无数个apache commons不知道删哪个好真是心塞。随着项目进展,计划把项目的公共包拆成若干个maven module,便于项目解耦。另外,也可以利用maven的构建流程,把测试作为一项正式流程,解决之前随手测试的现状。

比较喜欢追eclipse新版本,已经用到了luna。虽然自从3.x时代到现在,界面一直没什么太大的变化,但是细节方面新版本一般都会有些不错的特性。只有一次,忘了是juno还是kepler了,窗口管理的界面风格变得花哨起来,奇慢无比,不得已降了一次版本号。后来在下一次升级大版本号之后,速度有变得可以接受了。

luna集成了m2eclipse插件,如果是旧版本的话,需要在marketplace中下载。更旧的连macketplace都没有的版本,还是去升级一下吧。

通过新建项目向导,新建Maven Project。

1

选择项目名称和项目位置。第一个选项如果选中的话,不会在下一步出现选择archetype的界面。

2

 

选择Archetype。需要建立的是Java web项目,所以选择maven-archetype-webapp。

3

输入项目的groupid和 artifact id后,创建项目结束。

4

创建项目后,直接出现一个编译错误。打开之后发现是build path中缺少serlet包引用。

5

打开项目中的pom.xml,添加引用。可以用插件提供的编辑器,也可以直接编辑xml文件。

由于servlet.jar不需要发布,所以级别选择provided。保存之后,项目的编译错没有了。

6

项目已经自动建立了一些文件夹,src/main/webapp相当于WebContent目录,已经建好了WEB-INF等java web项目必备的文件夹。

7

java source folder中,只有resource目录,想新建src/main/java目录,提示该目录已经存在。这个问题一直没有解决,只好用资源管理器直接建一个。新建完成后,自动就被添加未了source folder,不清楚m2eclipse在此处是什么用意。

此时,项目已经可以run on server了。遇见一个错误,run的时候没有出现tomcat选项。查了好长时间发现,我只安装了tomacat7,在project facet选择3.1的时候就会出现这种情况,改成3.0或者更低就行了。估计是tomcat不支持3.1.

8

在run as中,选择maven build,在Goals中输入package,就可以执行打war包的操作。刷新项目,可以看到打成的war包出现在target目录下。同时,会出现与项目同名的文件夹。注意这个文件夹中不是用于开发的文件,不要混淆。

9

10