Spring Boot 过滤器和拦截器总结

![请输入图片描述][1]### 拦截器与过滤器的区别 过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。 SpringMVC的机制是由DispaterServlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的. 过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射,代理分静态代理和动态代理,动态代理是拦截器的简单实现。 ** 过滤器就是过滤的作用,在web开发中过滤一些我们指定的url 那么它能帮我们过滤什么呢? 那功能可就多了: 比如过拦截掉我们不需要的接口请求 修改请求(request)和响应(response)内容 完成CORS跨域请求等等 最简单明了的区别就是 <strong>过滤器可以修改request,而拦截器不能过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境拦截器可以调用IOC容器中的各种依赖,而过滤器不能过滤器只能在请求的前后使用,而拦截器可以详细到每个方法** 过滤器就是筛选出你要的东西,比如requeset中你要的那部分 拦截器在做安全方面用的比较多,比如终止一些流程 何时使用拦截器?何时使用过滤器? 如果是非spring项目,那么拦截器不能用,只能使用过滤器。 如果是处理controller前后,既可以使用拦截器也可以使用过滤器。 如果是处理dispaterServlet前后,只能使用过滤器。 过滤器:它依赖于servlet容器。在实现上,基于函数回调,它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的,是用来做一些过滤操作,获取我们想要获取的数据,比如:在Javaweb中,对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作。通常用的场景是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等 拦截器:它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是直接访问静态资源的请求则没办法进行拦截处理。 两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。 Spring boot使用过滤器 使用spring boot提供的FilterRegistrationBean注册Filter 使用原生servlet注解定义Filter 两种方式的本质都是一样的,都是去FilterRegistrationBean注册自定义Filter 方式一 先定义Filter ` import javax.servlet.*; import java.io.IOException; public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // do something 处理request 或response System.out.println("filter1"); // 调用filter链中的下一个filter filterChain.doFilter(servletRequest,servletResponse); //如果过滤通过,执行filterChain.doFilter(servletRequest,servletResponse); 不通过就执行直接返回 } @Override public void destroy() { } }` 注册自定义Filter `@Configuration public class FilterConfig { @Bean public FilterRegistrationBean registrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter()); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } }` 方式二 `@Component // 定义filterName 和过滤的url @WebFilter(filterName = "my2Filter" ,urlPatterns = "/*") public class My2Filter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("filter2"); filterChain.doFilter(servletRequest,servletResponse); //如果过滤通过,执行filterChain.doFilter(servletRequest,servletResponse); 不通过就执行直接返回 } @Override public void destroy() { } }` Spring boot 拦截器的使用 定义拦截器: `public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle"); return true;////如果false,停止流程,api被拦截 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { System.out.println("afterCompletion"); } }` 配置拦截器: `@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()); } }` Controller演示: `@RestController public class UController { @GetMapping("/home") public String home(){ System.out.println("home"); return "myhome"; } } 输出: preHandle home postHandle afterCompletion`

2019年5月24日 · 2 分钟 · 天边的星星

关于HttpUrlConnection请求网络加载证书与不加载证书的区别

测试的3个网址分别为: String uri1 = “https://mportal.tianjihuifu.com/tjhf/loginRegist/login?uname=13265468238&pwd=123456”; String uri2 = “https://mportal.tjhf.com/tjhf/loginRegist/login?uname=13265468238&pwd=123456”; String uri = “https://www.baidu.com/”; 中间用到的证书为cer_test.crt,证书信息为:CN=console.haitest.com, C=CN。分别测试了加载证书与不加载证书请求3个不同的网址的日志。 证书为cer_test.crt,没有HostnameVerifier E/==####DROXY####===: (**)发送请求(get):https://mportal.haitest.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)响应结果:{“data”:72771,”result”:true,”resultCode”:2000} E/==####DROXY####===: (**)发送请求(get):https://mportal.hai.com/hai/loginRegist/login?uname=13265468238&pwd=123456 W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. E/==####DROXY####===: (**)发送请求(get):https://www.baidu.com/ W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 证书为cer_test.crt,HostnameVerifier :return true E/==####DROXY####===: (**)发送请求(get):https://mportal.haitest.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)响应结果:{“data”:72771,”result”:true,”resultCode”:2000} E/==####DROXY####===: (**)发送请求(get):https://mportal.hai.com/hai/loginRegist/login?uname=13265468238&pwd=123456 W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. E/==####DROXY####===: (**)发送请求(get):https://www.baidu.com/ W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 证书为cer_test.crt,HostnameVerifier :return hostname.equals(session.getPeerHost()) E/==####DROXY####===: (**)发送请求(get):https://mportal.haitest.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)响应结果:{“data”:72771,”result”:true,”resultCode”:2000} E/==####DROXY####===: (**)发送请求(get):https://mportal.hai.com/hai/loginRegist/login?uname=13265468238&pwd=123456 W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. E/==####DROXY####===: (**)发送请求(get):https://www.baidu.com/ W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 证书为null,没有HostnameVerifier E/==####DROXY####===: (**)发送请求(get):https://mportal.haitest.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)发送请求(get):https://mportal.hai.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)响应结果:{“data”:72771,”result”:true,”resultCode”:2000} E/==####DROXY####===: (**)发送请求(get):https://www.baidu.com/ E/==####DROXY####===: (*_*)响应结果: ...

2019年5月21日 · 5 分钟 · 天边的星星

SpringBoot消失的Web.xml

Filter 过滤器作为web.xml中重要的一部分,有着相当高的出场率,SpringBoot会默认注册几个Filter ApplicationContextHeaderFilter CharacterEncodingFilter 如果添加了Security依赖的话会加入SpringSecurityFilterChain 如果加入Actuator依赖的话就会加入WebRequestTraceFilter 实现自己的Filter JavaConfig注册Bean 我们如果自己要实现自己的Filter的话,需要实现Filter并实现其中的方法 同时要利用JavaConfig的方法来配置,一般情况下需要编写@Bean注解的返回值为FilterRegistrationBean的方法来实现JavaBean的注册 具体实现如下 需要注意的是此方法需要在被@Configuration注解的配置类中 @WebFilter+@ServletComponentScan 如果觉得Java代码的方式比较繁琐的话可以采用注解方式注册Filter,具体实现方式是在Filter实现类加入@WebFilter注解 例如 然后在SpringBootApplication类上添加@ServletComponentScan Filter的注册原理 我们采用JavaConfig的形式实现了Filter的注册,通过向上追溯得知FilterRegistrationBean的层级结构如下 ServletContextInitializer RegistrationBean AbstractFilterRegistrationBean FilterRegistrationBean 经查阅SpringBoot文档发现针对ServletContextInitializer的描述如下 Interface used to configure a Servlet 3.0+ context programmatically. Unlike WebApplicationInitializer, classes that implement this interface (and do not implement WebApplicationInitializer) will not be detected by SpringServletContainerInitializer and hence will not be automatically bootstrapped by the Servlet container. This interface is primarily designed to allow ServletContextInitializers to be managed by Spring and not the Servlet container. ...

2019年3月19日 · 1 分钟 · 天边的星星

Mybatis Generator 无法生成selectByPrimaryKey、deleteByPrimaryKey、updateByPrimaryKey MySQL

问题现象: 最近因为一张表新加了字段,重新使用 mybatis-generator 生成了一下mapper文件,结果发现新生成的文件比之前少了xxxByPrimaryKey 的几个方法,对应的xml文件中同样也少了这几个, 并且xml文件中的resultMap节点里主键id使用的是result标签,而不是id标签。 排查原因: 首先想到的是:难道表没有主键了,于是赶紧检查了一下我的表结构,发现主键没有问题呀!表结构并没有大的变化,我仅仅是加了一个普通字段而已,那怎么会这样呢? 然后我又检查了generatorConfig.xml中table项中的属性 enableSelectByPrimaryKey=”true” enableUpdateByPrimaryKey=”true” enableDeleteByPrimaryKey=”true” 看看这几个属性是否被设置成了false,默认的值是true。 发现也没有问题,这里配置也没有改动过! 唯一想到的变化是mysql连接器版本进行了升级: mysql mysql-connector-java 5.1.35 /** 升级版本 **/ mysql mysql-connector-java 8.0.11 将版本改回去重新试了下果然就可以了。那么可以确信就是 mysql-connector-java 版本升级造成的问题! 解决方法: 很纳闷为什么升级了高版本反而有问题了呢,想到这既然是普遍问题,那应该别人早就遇到过这个问题了,网上搜了下,果然很多人在问这个问题。 最终看到一篇文章找到了解决方法: 在jdbcConnection节点里配置useInformationSchema属性,可以解决mybatis-generator不识别主键问题: 参考文章:https://my.oschina.net/u/2289161/blog/1589630 另外还看到有人说:如果使用的mysql驱动5.x版本的就可以生成,使用6.x 及以上的,那就无法生成了,必须显式设置:useInformationSchema=”true” 说明一下,我使用的maven插件版本是 1.3.5 org.mybatis.generator mybatis-generator-maven-plugin 1.3.5 src/test/resources/generatorConfig.xml true ——————— 参考:https://blog.csdn.net/rchm8519/article/details/81949916

2019年1月29日 · 1 分钟 · 天边的星星

命令行打包 war文件

根据自己项目的真实情况需要注意配置jdk环境,如果jdk环境不同可能造成打出的war包不能正常运行。例如 项目使用jdk1.7 打包使用javac必须为jdk1.7中的javac命令,tomcat需要配置执行的jdk环境为1.7。如果电脑使用的和项目使用的是同一个jdk,配置路径可以省略,其他情况不能省略。 命令行打包 war文件 echo 准备java文件 dir *.java/s/b > source.txt if exist out\classes ( echo 清理中… rd /S/Q out ) echo 清理中完成 md out\classes md out\webapp echo 编译源码 set JAVA_HOME=D:\Program Files\Java\jdk1.7.0_75 %JAVA_HOME%\bin\javac -cp .;E:\apache-tomcat-8.5.35\lib*;E:\apache-tomcat-8.5.35\bin*;E:\auto_test\zchfaxgb\src\main\webapp\WEB-INF\lib* -d out\classes -encoding utf-8 @source.txt echo 复制webapp目录 xcopy src\main\webapp out\webapp /s/e/i/y echo 创建编译源码路径 md out\webapp\WEB-INF\classes echo 复制classes目录 xcopy out\classes out\webapp\WEB-INF\classes /s/e/i/y echo 复制resources目录 xcopy src\main\resources out\webapp\WEB-INF\classes /s/e/i/y echo 开始打包 cd out\webapp echo 打包中 jar -cvf zcjf.war * move zcjf.war ../../ echo 打包完成 pause ...

2018年12月24日 · 1 分钟 · 天边的星星

Nginx 301重定向域名

## 为何要使用301重定向 在网站建设中需要网页重定向的情况很多:如网页目录结构变动,网页重命名、网页的扩展名改变、网站域名改变等。如果不做重定向,用户的收藏和搜索引擎数据库中的旧地址只能让访客得到一个404错误信息页面,访问流量白白丧失。不仅如此,之前该页面的一切积累(比如PR值)就都白费了。 301重定向不仅能使页面实现自动跳转,对于搜索引擎来说,也可能可以传递PR值。 &nbsp; **nginx重定向规则详细介绍** &nbsp; [http://www.jefflei.com/post/1015.html](http://www.jefflei.com/post/1015.html) **rewrite命令** nginx的rewrite相当于apache的rewriterule(大多数情况下可以把原有apache的rewrite规则加上引号就可以直接使用),它可以用在server,location 和IF条件判断块中,命令格式如下: rewrite 正则表达式 替换目标 flag标记 flag标记可以用以下几种格式: last – 基本上都用这个Flag。 break – 中止Rewirte,不在继续匹配 redirect – 返回临时重定向的HTTP状态302 permanent – 返回永久重定向的HTTP状态301 例如下面这段设定nginx将某个目录下面的文件重定向到另一个目录,2对应第二个括号(.)中对应的字符串: location /download/ { rewrite ^(/download/.)/m/(.).. 1/nginx-rewrite/2.gz break; } **nginx重定向的IF条件判断** 在server和location两种情况下可以使用nginx的IF条件判断,条件可以为以下几种: 正则表达式 如: 匹配判断 ~ 为区分大小写匹配; !~为区分大小写不匹配 ~* 为不区分大小写匹配;!~为不区分大小写不匹配 例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下: if (http_user_agent ~ MSIE) { rewrite ^(.*) /nginx-ie/$1 break; } **文件和目录判断 ** -f和!-f判断是否存在文件 -d和!-d判断是否存在目录 -e和!-e判断是否存在文件或目录 -x和!-x判断文件是否可执行 例如下面设定nginx在文件和目录不存在的时候重定向: if (!-e $request_filename) { proxy_pass http://127.0.0.1/; } ...

2018年12月10日 · 5 分钟 · 天边的星星

tomcat配置301重定向

tomcat默认情况下不带www的域名是不会跳转到带www的域名的,而且也无法像apache那样通过配置.htaccess来实现。如果想要把不带“www’的域名重定向到带”www”域名下,又不想写代码,可以使用UrlRewriteFilter来实现。 1.简介 urlRewriteFilter是一个用于改写URL的Web过滤器,类似于Apache的mod_rewrite。适用于任何Web应用服务器(如 Tomcat,jboss,jetty,Resin,Orion等)。其典型应用就把动态URL静态化,便于搜索引擎爬虫抓取你的动态网页。 2.下载 下载UrlRewriteFilter wget http://urlrewritefilter.googlecode.com/files/urlrewritefilter-4.0.3.jar 并放入tomcat的 WEB-INF/lib下 3.配置tomcat 编辑WEB-INF/web.xml 在其它servlet mapping前加入 <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>" data-snippet-id="ext.d9335c889eb8c29f7d0586484daf2dcb" data-snippet-saved="false" data-codota-status="done">&lt;filter&gt; &lt;filter-name&gt;UrlRewriteFilter&lt;/filter-name&gt; &lt;filter-class&gt;org.tuckey.web.filters.urlrewrite.UrlRewriteFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;UrlRewriteFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt; &lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt; &lt;/filter-mapping&gt; 4.添加跳转规则 在WEB-INF下新建urlrewite.xml文件,加入跳转规则 <rule> <name>seo redirect</name> <condition name=&quot;host&quot; operator=&quot;notequal&quot;>^www.example.com</condition> <condition name=&quot;host&quot; operator=&quot;notequal&quot;>^localhost</condition> <from>^/(.*)</from> <to type=&quot;permanent-redirect&quot; last=&quot;true&quot;>http://www.example.com/$1</to> </rule> </urlrewrite>" data-snippet-id="ext.8be7c6714e65fa3f79b0e1c6c6215563" data-snippet-saved="false" data-codota-status="done">&lt;urlrewrite&gt; &lt;rule&gt; &lt;name&gt;seo redirect&lt;/name&gt; &lt;condition name="host" operator="notequal"&gt;^www.example.com&lt;/condition&gt; &lt;condition name="host" operator="notequal"&gt;^localhost&lt;/condition&gt; &lt;from&gt;^/(.*)&lt;/from&gt; &lt;to type="permanent-redirect" last="true"&gt;http://www.example.com/$1&lt;/to&gt; &lt;/rule&gt; &lt;/urlrewrite&gt; 参考文章 http://nematodes.org/martin/2010/02/04/301-permanent-redirect-with-tomcat-howto/ ...

2018年12月10日 · 1 分钟 · 天边的星星

Java AES256加密解密实现

import it.sauronsoftware.base64.Base64; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; /** java实现AES256加密解密 依赖说明: bcprov-jdk15-133.jar:PKCS7Padding javabase64-1.3.1.jar:base64 local_policy.jar 和 US_export_policy.jar需添加到%JAVE_HOME%\jre\lib\security中(lib中版本适合jdk1.7) */ public class AES256 { public static byte[] encrypt(String content, String password) { try { //”AES”:请求的密钥算法的标准名称 KeyGenerator kgen = KeyGenerator.getInstance(“AES”); //256:密钥生成参数;securerandom:密钥生成器的随机源 SecureRandom securerandom = new SecureRandom(tohash256Deal(password)); kgen.init(256, securerandom); //生成秘密(对称)密钥 SecretKey secretKey = kgen.generateKey(); //返回基本编码格式的密钥 byte[] enCodeFormat = secretKey.getEncoded(); //根据给定的字节数组构造一个密钥。enCodeFormat:密钥内容;”AES”:与给定的密钥内容相关联的密钥算法的名称 SecretKeySpec key = new SecretKeySpec(enCodeFormat, “AES”); //将提供程序添加到下一个可用位置 Security.addProvider(new BouncyCastleProvider()); //创建一个实现指定转换的 Cipher对象,该转换由指定的提供程序提供。 //”AES/ECB/PKCS7Padding”:转换的名称;”BC”:提供程序的名称 Cipher cipher = Cipher.getInstance(“AES/ECB/PKCS7Padding”, “BC”); ...

2018年12月9日 · 2 分钟 · 天边的星星

轻量级微服务架构下总结

轻量级的微服务 总结:整个微服务使用Spring boot + Docker 冰山上,ZooKeeper服务注册、Node.js服务网关、Jenkins等冰山下。 总体上可以分为:开发框架(上)、容器技术(上)、注册中心(下)、调用中心、部署中心、日志中心、监控中心、追踪中心、消息中心、配置中心。 注册中心:用于注册微服务相关配置信息的中心 调用中心:用于提供给前端调用的统一入口(我们选用Node.js实现) 部署中心:用于编译并打包微服务源码并将其部署到Docker引擎中(Jenkins) 日志中心:用于收集并管理微服务应用程序中产生的日志 监控中心:用于监控微服务的实时运行状况 追踪中心:用于最终微服务的调用轨迹 消息中心:用于解耦服务之间的调用关系 配置中心:用于管理微服务应用程序所需的配置参数 (我们认为,中心分为两类:一类是含有业务意义的中心,另一类是不含业务意义的中心-只是技术层面的中心) 微服务日志 总结:docker中查看日志路径 /var/lib/docker/containers/<container_id目录看到一个container_id-json.log文件,Docker默认使用docker logs查看的就是这些json文件,Docker默认使用Json-file格式,还有其他格式 none:容器不输出任何日志 json-file:容器默认输出的日志以json格式写入文件中(默认) syslog:容器输出日志写入宿主机的Syslog中 journald:容器输出日志写入宿主机的Journald中 gelf:容器输出的日志以GELF(Graylog Extended log fromat)格式写入Graylog中 fluentd: 容器输出的日志写入宿主机的Fluentd中 awalogs:容器输出日志写入Ammazon CloudWatch Logs中 splunk:容器输出日志写入splunk中 etwlogs:容器输出日志写入ETW (event tracing for windows)中 gcplogs:容器输出日志写入GCP(Google Cloud Platform)中 nats:容器输出日志写入NATS服务器中 docker中 –log-driver参数配置日志驱动 –log-opt max-size –log-opt max-file 分别设置日志文件大小和日志文件数量 例如:docker run -p 80:80 –log-dirver json-file –log-opt max-size=10m –log-opt max-file=3 –name xxx 容器名称 docker日志驱动(https://docs.docker.com/engine/admin/logging/overview/) ...

2018年8月26日 · 1 分钟 · 天边的星星

Java 执行运行Jar文件

java执行jar文件命令 java -jar 文件.jar 到此就成功执行jar了, 我的jar中有多个入口,我想执行其他的入口,怎么搞? 不着急慢慢看下去 java运行jar包中指定Class的main方法,这时可以通过: java -cp xxx.jar xxx.com.xxxx [args] 其中-cp命令是将xxx.jar加入到classpath,这样java class loader就会在这里面查找匹配的类。 mac中执行apple script运行jar的命令 on run {input, parameters} set p to POSIX path of (path to me) do shell script “java -jar ” & p & “Contents/Jar/JavaSwingTest.jar” end run

2017年12月5日 · 1 分钟 · 天边的星星