问题描述:
中午在operation项目中新加了一个方法,lunara项目依赖的相应版本号,已经更新为对应的版本号,而且IDEA已经可以识别新加的方法了,但是程序跑起来就会抛错,提示noSuchMethodError。很奇怪,自己也点了IDEA右侧的maven里面的pacakage
后来和同事讨论才发现:右侧的pacakage并不会执行clean!!! 我屮艸芔茻 也就是说我们project的target依赖的lib仍然是老的jar包。但是IDEA识别到了本地的m2仓库的新jar包。
在一个web应用执行的过程中,idea仅仅负责编译、打包,真正运行项目还是tomcat去读取生成的war包 or war:exploded。
不过这样说也有一个问题,idea里面代码的变动是怎么反应到war包里的呢?还是说仅仅会变动改变的部分 而不会整体去打包?
私以为,变动会同步到exploded里面,然后tomcat再去执行就可以识别到了。而大部分情况仅仅是变动target--exploded中的一小部分,而依赖的lib里面的包并不会改变的
web项目在启动的时候,是要把项目本身的内容各种class 以及 依赖的jar一起打为war包 才能运行?不打war包,tomcat直接读取 exploded不行吗? 不过这样也许要在lib中引入依赖的jar包。
mvn clean 会清除整个target目录
mvn compile 会生成一些class文件里面装的就是各种.class文件
mvn package 会将项目打包并解压缩 此时会生成lib 里面有依赖的jar包
那么问题来了,只是执行mvn clean compile 再去运行项目 会怎么样? 等下去公司测试一发。
compile以后 target目录下 仍然没有项目的解压文件以及war包
运行抛出的错误( 此时tomcat配置中在启动之前毛都不做(加上build一样),无论是clean 还是 clean compile结果都如下所示):
Connected to server
[2017-07-14 09:23:33,256] Artifact wed-lunar-web:war exploded: Artifact is being deployed, please wait...
[2017-07-14 09:23:33,272] Artifact wed-lunar-web:war exploded: Error during artifact deployment. See server log for details.
[2017-07-14 09:23:33,273] Artifact wed-lunar-web:war exploded: com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionException: /Users/luyu/git/wed-lunar-web/target/wed-lunar-web-1.0.0.0-SNAPSHOT not found for the web module.
所以正常的步骤应该是 mvn clean package之后 再去运行项目! 或者在配置中加入Build xx-web:war exploded artifact . //选择war exploded时候会默认加上此项
[2017-07-14 09:42:43,662] Artifact wed-lunar-web:war: Artifact is being deployed, please wait...
[2017-07-14 09:42:43,703] Artifact wed-lunar-web:war: Error during artifact deployment. See server log for details.
[2017-07-14 09:42:43,704] Artifact wed-lunar-web:war: com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionException: /Users/luyu/git/wed-lunar-web/target/wed-lunar-web-alpha-1.0.0.0-SNAPSHOT.war not found for the web module.
=====
还有tomcat部署里面配置 war :exploded 和 war的区别
这里的配置是指,你把哪个传递给tomcat,前者是解压后的版本,这个样的话tomcat无需再去自己解压放到webapps目录中,而后者tomcat需要自己去解压缩效率偏低,但是idea推出了一个插件,可以让webapps直接指向target目录下解压好的包,
日常开发中选用war:exploded 这样可以支持热部署,将修改直接变动到对应的target下面的解压文件中。
这又引发一个疑惑,war的存在的意义是啥呢?既然这么麻烦
而且如果按照这个说法,二者仅仅是效率上的差别,但是我记得刚开始配置为war的时候,项目是无法运行的。这是为啥?
可以运行!
选择war部署的时候 居然可以 在mvn clean compile之后直接运行成功 = =!而且哪怕是mvn clean 之后 项目也会运行成功 不过此时不支持热部署
原来是因为在tomcat里面默认加了一句 运行之前打包 Build xx-web:war artifact 去掉还是不行
[2017-07-14 09:42:43,662] Artifact wed-lunar-web:war: Artifact is being deployed, please wait...
[2017-07-14 09:42:43,703] Artifact wed-lunar-web:war: Error during artifact deployment. See server log for details.
[2017-07-14 09:42:43,704] Artifact wed-lunar-web:war: com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionException: /Users/luyu/git/wed-lunar-web/target/wed-lunar-web-alpha-1.0.0.0-SNAPSHOT.war not found for the web module.
所以说如果配置了Build xx-web:war exploded artifact 或者 Build xx-web:war artifact 那么此时的关键点就在 clean 只要记得clean就ok
====
后来修改operation的一个方法,然后lunara这边 直接运行就可以反应过来 (更改操作日志的方法) 为什么这个 时候不需要变动呢?
这个问题 我想是这样的,因为lunara对operation的调用是 远程方法调用(如何?) 只要对应的api正确就可以,而此时api没有发生变化,变化的仅仅是biz所以没问题
这也解释了为什么 在api 里的service新加的方法 lunara需要重新打包才能执行了。此时target目录下 operation-api 包 还没有更新,所以会抛出noSuchMethodError
=====
为毛线程池不能被回收啊????
会触发OOM啊???
哪怕是方法中定义的线程池???
=========
master 只需要api toMaven 那么beta呢?