IDEA集成Resin启动Maven项目

Resin

前言

目前公司大部分的项目都是基于JDK1.6,使用Eclipse开发的。不过我还是想在IDEA上进行开发,用着比较顺手。但是在尝试使用IDEA启动公司项目的过程中遇到了很多问题。在不断尝试下,终于一一解决,特在此记录,以防遗忘。

环境说明

名称 版本
项目JRE 1.6
maven 3.2.5
maven jre 1.6
Resin 3.0.28
IntelliJ IDEA 2019.1.2

所遇到的各种坑

IDEA如何与resin集成

先来说一说在Eclipse中是如何配置的。

之前一直都是用的tomcat,resin算是刚接触。公司对于resin的配置采用项目对应其特有配置文件的形式进行web容器初始化的。比如,resin默认的配置文件为resin.xml,当resin启动时自身会读取该xml中相关的集群配置、数据源配置、工作目录配置等等。

在resin与Eclipse的集成过程中,是通过定义主启动函数,并设置其相关参数来进行初始化启动的。示例如下:

  1. 添加Java Application

    点击debug按钮右侧的小箭头,右键左侧菜单中的Java Application,选择new

  2. 启动配置

    • Main选项卡

      在右侧新的窗口中,点击第一行Project文本框右侧的***Browse…***按钮,选择需要进行部署的项目。

      img

      在第二行Main Class文本框中输入com.caucho.resin.Resin,指定主启动函数。

      下面的三个复选框可以忽略。

    • Arguments选项卡

      在第一个Program arguments文本框中,指定项目所用的Resin配置文件。

      在第二个配置文件中指定Resin的home目录、日志实现以及相关jvm参数配置。

      image

至此,Eclipse与Resin的集成就完成了。

但是,软件不一样,很多菜单的配置、软件的默认参数都不一样。比如,并没有要求配置Main Class以及Resin Home。

网上对于IDEA与Resin的集成方法文章较少,照抄是不太现实了,中间遇到了很多报错无法启动。只有自己摸索,不断尝试。具体的操作步骤见操作步骤章节中的Resin相关配置

Maven版本–JDK版本–AspectJ版本之间出现的问题

这块内容尝试了很长时间,如需最终结论,请看本段最后。

  • Maven版本与JDK版本

    最开始,我的windows环境中安装了两种JDK版本,分别为1.6与1.8。我将JAVA_HOME设置为1.8,然后在拉完项目后,将项目运行环境以及编译环境(Eclipse中的Compiler)设置为1.6。

    IDEA的Project Structure->Project选项卡->Project SDK设置为1.6。但发现此时maven无法clean install,因为我的maven使用的是3.3.6版本,并不支持JDK1.6。

    经过查找,我在IDEA的maven设置中找到可以设置maven自身的运行环境。点击设置中Maven下的Runner选项卡,将JRE调整为了1.8(默认跟随项目jdk版本,所以不调整就是1.6)。

    至此项目至少是可以clean install了。但却发生了下面的问题,见JDK版本–AspectJ版本

  • JDK版本–AspectJ版本

    在集成完成后,出现了这样的报错:

    1
    org.aspectj.apache.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 18

    经过查找资料,得知是aspectj版本过低的原因导致。可我项目已经配置了1.6的jre了啊?奇了怪了。我详细查看了AspectJ的报错日志,发现了问题所在。其中有一行是:

    1
    sun.boot.library.path=C:\Program Files\Java\jdk1.8.0_112\jre\bin

    原来在AspectJ进行编译的时候,读取的还是系统环境变量中的JAVA_HOME啊。找到了问题所在,便想从IDEA的项目环境配置入手,可是找了半天还是没找到如何给AspectJ配置环境变量。

  • 最终解决思路

    由于AspectJ的限制,所以决定更换系统的JAVA_HOME为1.6的路径。maven也更换为支持jdk1.6的3.2.5版本。IDEA项目中无论是project sdk还是maven的runner等等,都更换为了1.6。终于,项目能够正常打包,AspectJ也可以正常编译了。

操作步骤

Resin相关配置

如mic,对应resin/conf目录下的mic-site.conf文件

修改启动端口

1
2
<!-- 修改port -->
<http server-id="" host="*" port="8081">

修改compiling-loader

1
2
3
4
5
6
7
8
9
10
11
<host-default>
<class-loader>
<!-- 这里不确定是写
Project Structure->Project中配置的compile output目录
还是写生成的target中的classes目录,有待后续验证
-->
<compiling-loader path="D:\projects\ccs\ccs-web\target\classes"/>
<!-- library-loade未研究有何影响 -->
<library-loader path="webapps/WEB-INF/lib"/>
</class-loader>
</host-default>

修改工作空间目录

1
2
3
<host id="" root-directory=".">
<web-app id="/" document-directory="D:\projects\ccs\ccs-web\src\main\webapp"/>
</host>

IDEA相关配置

新建Resin配置界面

image

Server选项卡

先来个总图,大概长这样。

image

配置Application Server

选择Application Server右侧的***Configure…***按钮,打开其配置界面。

设置Resin Home为本地Resin所在目录,并勾选Include all resin JARs复选框。

设置Default resin configuration file,定义默认的Resin配置文件。

点击OK完成配置。

image

设置VM options

这里经过测试,不设置resin_home也是可以的,应该是idea会根据之前的配置自动读进去。

1
2
3
4
-Djava.util.logging.manager=com.caucho.log.LogManagerImpl
-Xms512m
-Xmx512m
-XX:MaxPermSize=256m
设置JRE

这里当然选择1.6

设置Resin configuration template

这里定义自己需要配置的自定义启动文件。如:

1560138919190

注意!,下面有一个复选框,叫做Do not alter Resin configuration

1560138982055

这里一定要勾上,亲测如果不勾会读不到上面的配置文件。

添加compiler output目录到classpath

如果不勾选Include compiler output and libraries on classpath,则会出现类似以下的报错信息:

1
java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter

一定要勾上这个复选框。

1560139156989

端口及字符集配置

如果上面勾选了Do not alter Resin configuration,那么无论这里设置什么http端口,都是以配置文件为准。

JMX port需要每个应用设置的不一样。

charset根据需要进行配置。

Deploy mode设置为automatic即可。

Deployment选项卡

添加所需要发布的Artifact

1560144659492

1560144708369

1560144802192

Deployment method需要修改为resin.xml。

JMX是把项目打包的文件 放在resin服务器下webapp下 只有在服务器启动时 才把项目给拷贝过去 无法在intellij中实时更新。

resin.xml是在C盘C:\Users\xxx\AppData\Local\Temp目录下 copy了一份resin.xml的配置文件 然后把服务器目录空间指向了你的项目工作空间 可以实现intellij修改实时更新

去掉***Use default context name(always true if deployment method is JMX)***的复选框。

Application context name 保持默认/不变。

至此,项目已经可以正常启动了。

小结

由于算是初次的尝试,没有现有实例可供参考,难免会有错误,所以开发过程中一定还会遇到各种问题。但我相信,路都是一步步走出来的,如有问题,恳请指出