GVKun编程网logo

初次使用 SpringBoot 内嵌服务器以 jar 包方式运行 web 工程遇到的坑(springboot 内置服务器)

1

如果您对初次使用SpringBoot内嵌服务器以jar包方式运行web工程遇到的坑和springboot内置服务器感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解初次使用SpringBoot内嵌

如果您对初次使用 SpringBoot 内嵌服务器以 jar 包方式运行 web 工程遇到的坑springboot 内置服务器感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解初次使用 SpringBoot 内嵌服务器以 jar 包方式运行 web 工程遇到的坑的各种细节,并对springboot 内置服务器进行深入的分析,此外还有关于2010(Flex 初次使用 小节:No.2)、2010(Flex 初次使用 小节结:No.1)、Executable Jar/Uber Jar/Shade Jar/Shadow Jar/Fat Jar 到底是什么东西?、IDEA 初次使用,记录心得的实用技巧。

本文目录一览:

初次使用 SpringBoot 内嵌服务器以 jar 包方式运行 web 工程遇到的坑(springboot 内置服务器)

初次使用 SpringBoot 内嵌服务器以 jar 包方式运行 web 工程遇到的坑(springboot 内置服务器)

这是第一个使用 SpringBoot 写的项目。

操作系统是 win10, 环境为 jdk1.8 + mysql5.6 + idea + maven。

打成 jar 包后启动倒是很顺利 (虽然时间有点儿长,差不多每次都在 10 秒左右)

然后问题就出现了,当我访问登录页面的时候,不报错也不能正常访问......

地址栏就一直在那里转圈圈

控制台也没有任何日志输出......

就在我等待了几分钟 (大概有个两三分钟吧......) 忍不住放弃的时候 (按下了 Ctrl+C)

它活过来了!!!

 几经波折最后找到了原因.......

在漫长的启动时间里,我忍不住手贱拿鼠标在小黑框里面点了几下,然后系统出于某种原因认为我可能想有某种操作,于是它就暂停在那里等待我去进行操作......

我按了 Ctrl+C 想要退出这个 jar 包得执行,被系统认为是退出那个不存在的操作的执行,于是就继续执行 jar 包......

所以,只要别点那个小黑框,就不会出现这种情况......

 

2010(Flex 初次使用 小节:No.2)

2010(Flex 初次使用 小节:No.2)

接这上一篇继续...

2 借助第三方的对象文件

swfobject.js 来向swf 传参

超链接的方式传参

<a href="VideoPlay.html?address=http://www.lxzq.com.cn/video/ty20100915_1.flv">Test</a>

 接收参数的页面

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

<head>

        <title></title>

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

       <script type="text/javascript" src="swfobject.js"></script>

              <script type="text/javascript">

                     var flashvars = {};

                     //获取URL参数对值,并赋给flashvars变量

if (swfobject.getQueryParamValue("address"))    //获取超链接的url?后面的参数

 {

         flashvars.address= swfobject.getQueryParamValue("address");      //swf文件传入参数     

}           

                        var params = {};  //一定是要这个params

                        params.allowFullScreen ="true";  //允许全屏否 根据自己的需要来设置参数

                     var attributes = {};

                     attributes.id = "swf";      //将嵌入的SWF文件写入对应iddiv中去,并向SWF文件传入相应的参数        

      swfobject.embedSWF("VideoPlay.swf", "swf", "1000", "500", "10.0.0", "expressInstall.swf", flashvars, params, attributes);

              </script>

</head>

//  swfobject.embedSWF里面的swf对应的是<div>id 是将swf文件放在哪里

       <body>

       <div id="swf">            

      </div>

       </body></html>

3 flex端与就javascript的通信

需要使用到ExternalInterface 这个对象

 Flex端的代码

   private function callJavaScript():void {

             show.text =  ExternalInterface.call("sayHelloWorld");

            }

// sayHelloWorld 这个就是javascript的里面的方法名

当然ExternalInterface.call这个方法还可以传参

ExternalInterface.call("js的函数名",”参数)

那么在html页面这一块的代码

很简单

Function sayHelloWorld()

{

做自己需要的处理

如果flex端要接受返回值的话

那么js里面就一定要

return “xxxxx”;

}

貌似这个有个弊端

那就是 这种flexjavascript的互调只能在拥有flex框架载体的情况下才能用

也就是flex工程里面才可以用

为什么这么说 那是因为 我之前就是通过这种方式 swf文件去调用js的函数

脱离了flex的工程 行不通

网上 基本上都是说的在flex工程的bin-degug文件下系统自动生成的html里面写js

我试过 只要是flex项目里面  flex javascript的相互调用是没问题的

2010(Flex 初次使用 小节结:No.1)

2010(Flex 初次使用 小节结:No.1)

最近一段时间 一直在搞flex,用flex做一个视频播放器现在已经全部搞好了,小有收获 ,特此贴出自己的历程

这里面主要的东西是在不同的情况下 一个文件怎么去接受外部的参数

让这个播放器成为一个被动请求者,也就是视频源是动态的

这里有两种方式是搞成功的

1>    Flex.mxml /.as  文件 接收 外部参数  这种是借助<object >标签

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"

                     id="VideoPlay" width="500" height="465"

                     codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">

                     <param name="movie" value="FlvVideo.swf" />

                     <param name="quality" value="high" />

                     <param name="bgcolor" value="#ffffff" />

                     <param name="allowScriptAccess" value="always" />

                    <param name="allowFullScreen" value="true" /> //默认是没有这个参数的,因为是视频要有全屏功能

           <paramname="FlashVars" VALUE="address=http://www.lxzq.com.cn/video/ty20100915_1.flv" />  //要传的参数

                     <embed src="FlvVideo.swf" quality="high" bgcolor="#ffffff"  //这个就是视频的播放器文件

                            width="100%" height="100%" name="VideoPlay" align="middle"

                            play="true"

                            loop="false"

                            quality="high"

                            allowScriptAccess="always"     

                          allowFullScreen="true"

                            type="application/x-shockwave-flash"

FlashVars="address=http://www.lxzq.com.cn/video/ty20100915_1.flv" 要传的参数

                            pluginspage="http://www.adobe.com/go/getflashplayer">

                     </embed>

       </object>

传参设置

 <paramname="FlashVars" VALUE="address=http://www.lxzq.com.cn/video/ty20100915_1.flv"

参数address=http://www.lxzq.com.cn/video/ty20100915_1.flv

很关键的一点是

<embed 标签里面 也要设置

FlashVars="address=http://www.lxzq.com.cn/video/ty20100915_1.flv"

这种传参

.mxml.as文件里面获取他的方式是

      //动态加载视频地址

        private function init():void {

           //获取外部传给SWF文件的参数值对

           var obj:Object = stage.loaderInfo.parameters;

           if(obj.address != null) {  

           =obj.address; //根据自己的需要来处理

           }

初次发表于个人空间:http://user.qzone.qq.com/1538185017/blog/1285056288

Executable Jar/Uber Jar/Shade Jar/Shadow Jar/Fat Jar 到底是什么东西?

Executable Jar/Uber Jar/Shade Jar/Shadow Jar/Fat Jar 到底是什么东西?

在Java里,如果要运行一个Java程序,那么需要一个包含main方法Class的Jar包或者Class文件,然后执行命令

# 运行一个class文件
java $class

# 运行一个Java包(Manifest中指定了Main-Class)
java -jar $jarfile

# 运行一个Class的main方法,并且将多个jar包添加到运行时的classpath
java -cp(-classpath) $path(目录/jar文件/zip文件) #zip文件需要符合jar格式的规范

这种方式会有一些弊端,因为大多数的Java程序里,会包含很多依赖,如果要启动这个程序就必须要通过-classpath来指定这些依赖包文件,而这些classpath的指定还必须得在服务器上去指定,不是很方便

尤其是在DevOps/微服务的盛行下,这种指定classpath的方式显得太不灵活了,能不能做到直接构建一个聚合的jar包,执行发布或者运行呢?

Executable Jar

Executable Jar(可执行的jar包),一般是指将所有依赖的jar包都放在一个Jar包内,这个Jar包包含了所有运行时需要依赖的Jar包代码,不过并没有规定这个“放”的方式,可以是将依赖的jar包直接放在入口jar包内,就像这样

├─executable jar
│  ├─META-INF
│  │  ├─MANIFEST.MF
│  ├─com...
│  ├─lib
│  │  ├─io.netty....jar
│  │  ├─com.google....jar
│  │  ├─com.github....jar
│  │  ├─org.apache.....jar

也可以是将依赖的jar包内的文件给拷贝到入口的Jar包内,就像这样:

├─executable jar
│  ├─META-INF
│  │  ├─MANIFEST.MF
│  ├─com...
│  ├─io.netty.... classes
│  ├─com.google.. classes
│  ├─com.github.. classes
│  ├─org.apache.. classes

Spring Boot 算是把 Executable Jar传到了千家万户,Spring Boot中提供了一个Maven插件spring-boot-maven-plugin,这个插件可以将你所有的Maven依赖Jar包在构建时打包到一个jar文件内,并且通过Spring Boot的ClassLoader和启动类,可以加载到这些Executable Jar包中的Jar包,就是上面介绍的第一种方式:将依赖的jar包直接放在入口jar包内

Uber Jar

第一次看到这个词的时候,一头雾水,不知道这个单词是个什么鬼意思,Uber打车?

在查阅资料后才知道,Uber Jar的原单词是Über Jar,是德语单词,可以解释为"Over",结束的意思,不过在实际的上下文中,翻译为“一切”可能更合适。

这个术语最初是由开发人员创造的,他们认为将所有依赖项和自己的代码放入一个jar文件中可以解决很多冲突问题。但是大多数输入法上德语Ü很难打出来,所以就成了"Uber "。

Fat jar

Fat 翻译为肥的、胖的、大的,Fat jar就很好解释了:一个“肥胖的” jar,和Uber jar表达的含义,指的是包含所有依赖包的Jar包

Shade Jar/Shadow Jar

shade机翻为阴影、遮蔽,shade jar是指将jar包及其依赖包打包到一个jar文件内,同时提供shade“遮蔽/重命名”某些依赖包的功能

比如一个Maven工程,依赖了很多三方包,但实际打包时你想重命名部分包,这个重命名的过程在这里可以叫shade

这里详细解释下“shade”,shade在这个过程里的目的时重命名某些包,那么为什么要重命名呢?

比如我们基于JAVA Instrumentation API去开发一个Agent,我们在开发这个Agent时也需要依赖一些三方包,比如Netty,那么在实际运行时需要通过-javaagent或者动态attach agent jar的形式去加载我们这个Agent jar包;

这里加载的Agent只能是一个独立的jar包,所以首先要将我们的agent和依赖的包都打到一个jar包内,构建一个"Uber jar";然后需要考虑Class包冲突的问题,因为Agent内的依赖包的Class,和目标JVM进程中的Class很可能是冲突的,比如Agent中依赖了netty 4.1.58.Final ,而目标JVM进程中依赖了netty 4.0.14.Final,而我们的Agent中使用了4.0.14中不存在的API(比如某个类的方法,是新版本新增的);此时程序就会出错了,NoSuchMethodError,因为目标进程已经加载了那个Class,Agent包中的同名Class不会被重复加载

这里解决这种冲突问题的话,有一个简单的方案,在构建"Uber jar"时,将依赖的包的包名修改,重定位(relocaiton),比如将io.netty修改为com.github.kongwu.io.netty,同时将Java代码中所有的引用都修改为重定位之后的包名。这样,通过修改包名,就完美避开了依赖包Class冲突的问题

而上面这个“重定位”的行为,就叫Shade,或者叫Shadow

Maven中的Shade 插件为https://maven.apache.org/plugins/maven-shade-plugin/,可以将程序打包成一个独立的Jar包,包含依赖包

另一款类似的Maven插件为https://maven.apache.org/plugins/maven-assembly-plugin/usage.html,也可以实现同样的效果

Gradle中也有类似的插件https://imperceptiblethoughts.com/shadow/,功能也很强大,也支持shade功能

参考

  • https://maven.apache.org/plug...
  • https://stackoverflow.com/que...
  • https://dzone.com/articles/th...
  • http://andymrb.blogspot.com/2...

IDEA 初次使用,记录心得

IDEA 初次使用,记录心得

以前自己整理的随笔,发出来 记录一下吧。当是为自己的技术博客开个头!!!

 

  • Intellij IDEA缓存文件的默认位置修改

  1、默认状态用户文档目录下的.IntelliJIdea2016.3目录
  2、进入IDEA软件目录下的bin目录,修改idea.properties文件,涉及修改的文件如下(文档中默认是注释掉的,在文章开头部分)
    idea.config.path=D:/Program Files (x86)/JetBrains/IntelliJ IDEA 2016.3.4/config [此处目录可自己设置,这里是设置到idea安装目录下]
    idea.system.path=D:/Program Files (x86)/JetBrains/IntelliJ IDEA 2016.3.4/system
    idea.plugins.path=${idea.config.path}/plugins
    idea.log.path=${idea.system.path}/log

  • Intellij IDEA WEB项目配置(Artifacts配置)

  1、配置项目的Artifacts,选择Web Application:Exploded
    Output Layout设置:1)对于Available Elements中的项目,右击:Put into output root;2)选中output root,添加一个Directory Content,目录为resources
  2、配置tomcat,其中设置 Deployment中添加配置的Artifacts

  • 常用快捷键整理

    Ctrl + F 在当前文件进行文本查找
    Ctrl + R 在当前文件进行文本替换
    Ctrl + Z 撤销
    Ctrl + Y 删除光标所在行 或 删除选中的行
    Alt + Enter IntelliJ IDEA 根据光标所在问题,提供快速修复选择,光标放在的位置不同提示的结果也不同
    Alt + Insert 代码自动生成,如生成对象的 set / get 方法,构造函数,toString() 等
    Ctrl + Alt + L 格式化代码,可以对当前文件和整个包目录使用
    Ctrl + Alt + O 优化导入的类,可以对当前文件和整个包目录使用
    Shift + Enter 开始新一行。光标所在行下空出一行,光标定位到新行位置
    Ctrl + Shift + Z 取消撤销 (必备)
    连按两次Shift 弹出 Search Everywhere 弹出层

 

待补充... ...

 

今天关于初次使用 SpringBoot 内嵌服务器以 jar 包方式运行 web 工程遇到的坑springboot 内置服务器的介绍到此结束,谢谢您的阅读,有关2010(Flex 初次使用 小节:No.2)、2010(Flex 初次使用 小节结:No.1)、Executable Jar/Uber Jar/Shade Jar/Shadow Jar/Fat Jar 到底是什么东西?、IDEA 初次使用,记录心得等更多相关知识的信息可以在本站进行查询。

本文标签: