文档章节

Adobe CQ5 __Dispatcher

_Eddy
 _Eddy
发布于 2014/11/12 10:13
字数 2867
阅读 154
收藏 0
点赞 0
评论 0

1. dispatcher作用

通过web服务器达到页面缓存和负载均衡的作用

2.配置dispatcher流程##

  1. 安装web服务器
  2. 下载对应环境和web服务器版本的dispatcher版本
  3. 将dispatcher解压,将dispatcher conf文件和dispatcher module文件移入web服务器
  4. 配置服务器conf文件和dispatcher.any文件,将dispatcher和web服务器进行整合;如图: 在此输入图片描述 另外可参见: How to Use the Adobe CQ5 Dispatcher 配置步骤

3. 配置dispatcher具体步骤

<h3> 3.1 window配置dispatcher </h3> <h4>3.1.1 安装web服务器 </h4> window下安装apache服务器,`httpd-2.2.25-win32-x86-no_ssl.msi`,一直下一步,如果遇到如图提示: ![在此输入图片描述][3]<br/> 查找得知出现此异常的原因是80端口号被占用 解决方法: 修改apache默认端口号(关闭占用80端口号的进程) 在apache安装目录下的conf文件夹下找到httpd.conf文件,将Listener端口号由原来的80改为81。

<h4>3.1.2 下载dispatcher</h4> 访问package share页面,登陆进入,搜索框搜索dispatcher,然后根据自己的web服务器版本选择对应版本的dispatcher,下载。`dispatcher-apache2.2-windows-x86-4.1.0.zip`

<h4>3.1.3 dispatcher与apache整合</h4> 1. 解压dispatcher,将module文件夹下的`disp_apache2.2.dll`拷贝至apache安装目录下的module目录下; 将coonf文件夹下的`dispatcher.any`拷贝至apache安装目录下的conf目录下。 2. 修改apache的conf文件,httpd.conf。使apache服务器启动时也会把dispatcher启动。<br/> 添加配置如下:在loadModule末尾引入dispatcher.any,如下图: ![在此输入图片描述][4] 将directory配置区域修改如下: ![在此输入图片描述!][5]<br/> 之后重启apache服务器,启动正常且apache安装目录下的logs文件夹下出现dispatcher.log日志文件,则dispatcher 与apache初步整合成功,如图。 ![在此输入图片描述][6]

<h4>3.1.4 dispatcher.any配置</h4> 配置dispatcher.any,指定缓存路径,缓存保存位置等,参数详解: <h5> /farms</h5> /farms块定义一系列的farms或者websites。每个/farms块定义了:<br/> * 多个publish instance的负载均衡 /renderers <br/> * 定义publish instance的ip和端口号,缓存数据来源 <br/> * 更多的特性,包括缓存文件的存放位置,具体缓存哪些东西等 <br/> 注:如果dispatcher配置文件过大,可以分割成几个小的配置文件来引入,如下: /farms { $include "myFarm.any" } <h6> /website</h6> <h6> /clientheaders </h6> /clientheaders块定义了一系列从客户端client到CQ instance的http headers请求头.默认情况下CQ Dispatcher转发 标准的HTTP 请求头至CQ instance。在一些instances中,你可能需要:<br/> * 添加headers : 如自定义请求头 * 移除headers:如与web服务器有关的认证headers,例子如下: ![在此输入图片描述][7] 当然,也可以直接定义转发所有请求头: /clientheaders { "*" } <h6> /virtualhosts </h6> virtualhosts块定义了dispatcher从网页端接受的hostname/URI的列表集合,也可以直接用"*"通配符来匹配所有。 <h6> /renders /rend01 /hostname, /port, /timeout</h6> renders块定义了CQ Dispatcher接受的publish instance的主机名和端口号,配置多个publish instance可以达到 负载均衡的效果,如下: # The load will be balanced among these render instances /renders { /rend01 { # Hostname or IP of the render /hostname "localhost" # Port of the render /port "4502" # Connect timeout in milliseconds, 0 to wait indefinitely # /timeout "0" } /rend02 { /hostname "121.40.140.2" /port "4502" # /timeout "0" } } <h6> /filter</h6> filter块可以尽可能的限制外部访客可以访问的路径,下图演示:先限制所有可用路径,然后 对外部访客可访问的元素加以配置; # The filter section defines the requests that should be handled by the dispatcher. # The globs will be compared against the request line, e.g. "GET /index.html HTTP/1.1". /filter { # Deny everything first and then allow specific entries /0001 { /type "deny" /glob "*" }

      # Open consoles
      # /0011 { /type "allow" /glob "* /admin/*"  }  # allow servlet engine admin
      # /0012 { /type "allow" /glob "* /crx/*"    }  # allow content repository
      # /0013 { /type "allow" /glob "* /system/*" }  # allow OSGi console
        
      # Allow non-public content directories
      /0021 { /type "allow" /glob "* /apps/*"   }  # allow apps access
      /0022 { /type "allow" /glob "* /bin/*"    }
      /0023 { /type "allow" /glob "* /content*" }  # disable this rule to allow mapped content only
      
      /0024 { /type "allow" /glob "* /libs/*"   }
      # /0025 { /type "deny"  /glob "* /libs/shindig/proxy*" } # if you enable /libs close access to proxy

      /0026 { /type "allow" /glob "* /home/*"   }
      /0027 { /type "allow" /glob "* /tmp/*"    }
      /0028 { /type "allow" /glob "* /var/*"    }

      # Enable specific mime types in non-public content directories 
      /0041 { /type "allow" /glob "* *.css *"   }  # enable css
      /0042 { /type "allow" /glob "* *.gif *"   }  # enable gifs
      /0043 { /type "allow" /glob "* *.ico *"   }  # enable icos
      /0044 { /type "allow" /glob "* *.js *"    }  # enable javascript
      /0045 { /type "allow" /glob "* *.png *"   }  # enable png
      /0046 { /type "allow" /glob "* *.swf *"   }  # enable flash
      /0047 { /type "allow" /glob "* *.jpg *"   }  # enable jpg
      /0048 { /type "allow" /glob "* *.jpeg *"  }  # enable jpeg

      # Enable features 
      /0062 { /type "allow" /glob "* /libs/cq/personalization/*"  }  # enable personalization

      # Deny content grabbing
      /0081 { /type "deny"  /glob "GET *.infinity.json*" }
      /0082 { /type "deny"  /glob "GET *.tidy.json*"     }
      /0083 { /type "deny"  /glob "GET *.sysview.xml*"   }
      /0084 { /type "deny"  /glob "GET *.docview.json*"  }
      /0085 { /type "deny"  /glob "GET *.docview.xml*"  }
      
      /0086 { /type "deny"  /glob "GET *.*[0-9].json*" }
      # /0087 { /type "allow" /glob "GET *.1.json*" }          # allow one-level json requests

      # Deny query
      /0090 { /type "deny"  /glob "* *.query.json*" }
      }

Adobe推荐/libs,/etc,/crx,/admin,/var,/tmp,/home,/apps和其它的一些URIS都不能被外部访问。

<h6>/cache</h6> chche块指定了Dispatcher缓存文件的位置和规则等,包括的参数有 1. /docroot: 指定服务器缓存的根目录,也是缓存文件所存放的目录:e.g /docroot "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs" 2. /statfile /statfileslevel定义当页面被激活时网站树中的那一部分是不可用的 注:你可能会用到/statfile或者/statfilelevel,但是不能两者都有! e.g # Sets the level upto which files named ".stat" will be created in the # document root of the webserver. When an activation request for some # page is received, only files within the same subtree are affected # by the invalidation. /statfileslevel "2" 3. /allowAuthorized 定义是否缓存请求中的认证证书,授权信息, 一般情况下是不会缓存带有认证头部的页面的,可以指定allowAuthorized属性来缓存认证授权信息e.g # Flag indicating whether to cache responses to requests that contain # authorization information. /allowAuthorized "0" 4. /rules 定义缓存哪些页面,要缓存页面的规则 需要注意的是一些页面永远不会被缓存: * 如果http方法是get请求 * 另外一些包含post请求的form表单 * 动态的页面,例如搜索结果也不会被缓存 * 请求URL中包含“?” * 请求头包含认证信息(这个可以配置) * URL需要扩展名来决定文档类型 .e.g /rules { /0000 { # the globbing pattern to be compared against the url # example: * -> everything # : /foo/bar.* -> only the /foo/bar documents # : /foo/bar/* -> all pages below /foo/bar # : /foo/bar[./]* -> all pages below and /foo/bar itself # : *.html -> all .html files /glob "*" /type "allow" } /0001 { # the globbing pattern to be compared against the url # example: * -> everything # : /foo/bar.* -> only the /foo/bar documents # : /foo/bar/* -> all pages below /foo/bar # : /foo/bar[./]* -> all pages below and /foo/bar itself # : *.html -> all .html files /glob "/en/news" /type "allow" } /0002 { # the globbing pattern to be compared against the url # example: * -> everything # : /foo/bar.* -> only the /foo/bar documents # : /foo/bar/* -> all pages below /foo/bar # : /foo/bar[./]* -> all pages below and /foo/bar itself # : *.html -> all .html files /glob "*/private/*" /type "allow" } /0003 { ..... } .... } 5. /invalidate: 定义content修改后服务器缓存中的相关无效资源和页面,(服务器会重新缓存该文件和文件夹) # The invalidate section defines the pages that are "invalidated" after # any activation. Please note that the activated page itself and all # related documents are flushed on an modification. For example: if the # page /foo/bar is activated, all /foo/bar.* files are removed from the # cache. /invalidate { /0000 { /glob "*" /type "deny" } /0001 { # Consider all HTML files stale after an activation. /glob "*.html" /type "allow" } /0002 { /glob "*.zip" /type "allow" } /0003 { /glob "*.pdf" /type "allow" } } <h4> 3.2 实验版dispatcher.any详细配置</h4> # Each farm configures a set of load balanced renders (i.e. remote servers) /farms { # First farm entry /website { # Request headers that should be forwarded to the remote server. /clientheaders { # Forward all request headers that are end-to-end. If you want # to forward a specific set of headers, you'll have to list # them here. "*"

              }
              
            # Hostname globbing for farm selection (virtual domain addressing)
            /virtualhosts
              {
              # Entries will be compared against the "Host" request header
              # and an optional request URL prefix.
              #
              # Examples:
              #
              #   www.company.com
              #   intranet.*
              #   myhost:8888/mysite
              "*"
              }
              
            # The load will be balanced among these render instances
            /renders
              {
              /rend01
                {
                # Hostname or IP of the render
                /hostname "localhost"
                # Port of the render
                /port "4502"
                # Connect timeout in milliseconds, 0 to wait indefinitely
                # /timeout "0"
                }
        	  /rend02
                {
                /hostname "121.40.140.2"
                /port "4502"
                # /timeout "0"
                }
        	  /rend03
                {
                /hostname "121.40.140.2"
                /port "4503"
                /timeout "0"
                }
              }
        	  
        	  
              
            # The filter section defines the requests that should be handled by the dispatcher.
            # The globs will be compared against the request line, e.g. "GET /index.html HTTP/1.1".
            /filter
              {
              # Deny everything first and then allow specific entries
              /0001 { /type "deny"  /glob "*" }
                
              # Open consoles
        #     /0011 { /type "allow" /glob "* /admin/*"  }  # allow servlet engine admin
        #     /0012 { /type "allow" /glob "* /crx/*"    }  # allow content repository
        #     /0013 { /type "allow" /glob "* /system/*" }  # allow OSGi console
                
              # Allow non-public content directories
              /0021 { /type "allow" /glob "* /apps/*"   }  # allow apps access
              /0022 { /type "allow" /glob "* /bin/*"    }
              /0023 { /type "allow" /glob "* /content*" }  # disable this rule to allow mapped content only
              
              /0024 { /type "allow" /glob "* /libs/*"   }
        #     /0025 { /type "deny"  /glob "* /libs/shindig/proxy*" } # if you enable /libs close access to proxy
        
              /0026 { /type "allow" /glob "* /home/*"   }
              /0027 { /type "allow" /glob "* /tmp/*"    }
              /0028 { /type "allow" /glob "* /var/*"    }
        
              # Enable specific mime types in non-public content directories 
              /0041 { /type "allow" /glob "* *.css *"   }  # enable css
              /0042 { /type "allow" /glob "* *.gif *"   }  # enable gifs
              /0043 { /type "allow" /glob "* *.ico *"   }  # enable icos
              /0044 { /type "allow" /glob "* *.js *"    }  # enable javascript
              /0045 { /type "allow" /glob "* *.png *"   }  # enable png
              /0046 { /type "allow" /glob "* *.swf *"   }  # enable flash
              /0047 { /type "allow" /glob "* *.jpg *"   }  # enable jpg
              /0048 { /type "allow" /glob "* *.jpeg *"  }  # enable jpeg
        
              # Enable features 
              /0062 { /type "allow" /glob "* /libs/cq/personalization/*"  }  # enable personalization
        
              # Deny content grabbing
              /0081 { /type "deny"  /glob "GET *.infinity.json*" }
              /0082 { /type "deny"  /glob "GET *.tidy.json*"     }
              /0083 { /type "deny"  /glob "GET *.sysview.xml*"   }
              /0084 { /type "deny"  /glob "GET *.docview.json*"  }
              /0085 { /type "deny"  /glob "GET *.docview.xml*"  }
              
              /0086 { /type "deny"  /glob "GET *.*[0-9].json*" }
        #     /0087 { /type "allow" /glob "GET *.1.json*" }          # allow one-level json requests
        
              # Deny query
              /0090 { /type "deny"  /glob "* *.query.json*" }
              }
        
            # The cache section regulates what responses will be cached and where.
            /cache
              {
              # The docroot must be equal to the document root of the webserver. The
              # dispatcher will store files relative to this directory and subsequent
              # requests may be "declined" by the dispatcher, allowing the webserver
              # to deliver them just like static files.
        	  # /docroot "<Apache_document_root>"
        	  # /docroot "G:/aaa"
              /docroot "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs"
        	
        	  
              # Sets the level upto which files named ".stat" will be created in the 
              # document root of the webserver. When an activation request for some 
              # page is received, only files within the same subtree are affected 
              # by the invalidation.
              /statfileslevel "2"
              
              # Flag indicating whether to cache responses to requests that contain
              # authorization information.
              /allowAuthorized "0"
              
              # Flag indicating whether the dispatcher should serve stale content if
              # no remote server is available.
              #/serveStaleOnError "0"
              
              # The rules section defines what responses should be cached based on
              # the requested URL. Please note that only the following requests can
              # lead to cacheable responses:
              #
              # - HTTP method is GET
              # - URL has an extension
              # - Request has no query string
              # - Request has no "Authorization" header (unless allowAuthorized is 1)
              /rules
                {
                /0000
                  {
                  # the globbing pattern to be compared against the url
                  # example: *             -> everything
                  #        : /foo/bar.*    -> only the /foo/bar documents
                  #        : /foo/bar/*    -> all pages below /foo/bar
                  #        : /foo/bar[./]* -> all pages below and /foo/bar itself
                  #        : *.html        -> all .html files
                  /glob "*"
                  /type "allow"
                  }
        		/0001
                  {
                  # the globbing pattern to be compared against the url
                  # example: *             -> everything
                  #        : /foo/bar.*    -> only the /foo/bar documents
                  #        : /foo/bar/*    -> all pages below /foo/bar
                  #        : /foo/bar[./]* -> all pages below and /foo/bar itself
                  #        : *.html        -> all .html files
                  /glob "/en/news"
                  /type "allow"
                  }
        		/0002
                  {
                  # the globbing pattern to be compared against the url
                  # example: *             -> everything
                  #        : /foo/bar.*    -> only the /foo/bar documents
                  #        : /foo/bar/*    -> all pages below /foo/bar
                  #        : /foo/bar[./]* -> all pages below and /foo/bar itself
                  #        : *.html        -> all .html files
                  /glob "*/private/*"
                  /type "allow"
                  }
        		/0003
                  {
                  # the globbing pattern to be compared against the url
                  # example: *             -> everything
                  #        : /foo/bar.*    -> only the /foo/bar documents
                  #        : /foo/bar/*    -> all pages below /foo/bar
                  #        : /foo/bar[./]* -> all pages below and /foo/bar itself
                  #        : *.html        -> all .html files
                  /glob "*/private/*"
                  /type "allow"
                  }
        		/0004
                  {
                  /glob "*/content/*"
                  /type "allow"
                  }
        		/0005
                  {
                  /glob "*/var/*"
                  /type "allow"
                  }
        		/0006
                  {
                  /glob "*/system/*"
                  /type "allow"
                  }
                }
                
              # The invalidate section defines the pages that are "invalidated" after
              # any activation. Please note that the activated page itself and all 
              # related documents are flushed on an modification. For example: if the 
              # page /foo/bar is activated, all /foo/bar.* files are removed from the
              # cache.
              /invalidate
                {
                /0000
                  {
                  /glob "*"
                  /type "deny"
                  }
                /0001
                  {
                  # Consider all HTML files stale after an activation.
                  /glob "*.html"
                  /type "allow"
                  }
                /0002
                  {
                  /glob "*.zip"
                  /type "allow"
                  }
                /0003
                  {
                  /glob "*.pdf"
                  /type "allow"
                  }
                }
        
              # The allowedClients section restricts the client IP addresses that are
              # allowed to issue activation requests.
              /allowedClients
                {
                # Uncomment the following to restrict activation requests to originate
                # from "localhost" only.
                #
                #/0000
                #  {
                #  /glob "*"
                #  /type "deny"
                #  }
                #/0001
                #  {
                #  /glob "127.0.0.1"
                #  /type "allow"
                #  }
                }
                
              # The ignoreUrlParams section contains query string parameter names that
              # should be ignored when determining whether some request's output can be
              # cached or delivered from cache.
              #
              # In this example configuration, the "q" parameter will be ignored. 
              /ignoreUrlParams
        		  {
        			  /0001 { /glob "*" /type "allow" }
        			  /0002 { /glob "q" /type "allow" }
        		  }
              
              }
              
            # The statistics sections dictates how the load should be balanced among the
            # renders according to the media-type. 
            /statistics
              {
              /categories
                {
                /html
                  {
                  /glob "*.html"
                  }
                /others
                  {
                  /glob "*"
                  }
                }
              }
            }
          }

此时就可以通过本机web服务器访问启动的instance上的一些页面了。

4. 最后一步,配置Dispatcher Flush Agent

1. 虽然是为publish instance配制dispatcher,进行缓存,但配制是在author instance上的。 进入author instance的Tools页面,切换至Replication------------->Agents on publish ---------------->Dispatcher Flush页面,重新拷贝一份,如图 在此输入图片描述 2. 进入拷贝的Dispatcher Flush页面,点击Edit进入设置页面, Settings tab设置dispatcher Flush的名称Name,描述Description,设置启动开关Enabled Transport tab设置URI ,我本机apache为http://localhost:81/dispatcher/invalidate.cache,点击OK. 在此输入图片描述 至此,window下dispatcher已经全部配置完成。

5. 后记

apache服务器安装时记得在httpd.conf文件内修改默认端口号Listener; dispatcher.any配置时记得配置renders,设置ip和端口号port,用来指定扫描的instance

© 著作权归作者所有

共有 人打赏支持
_Eddy
粉丝 5
博文 21
码字总数 16825
作品 0
杭州
程序员
Servlet Filter in OSGi enabled web application

Servlet filters are an important component of web application and it can be used in different scenarios, e.g.: 1) Authenticating requests (ServletRequest) before delegating them......

银月光海 ⋅ 2015/11/27 ⋅ 0

Servlet Filter not working for Filter on Reques...

You had to add <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> to My Filter mapping, which now looks like <filter-mapping> <filter-name>VJFilterTest</filter-na......

zuoer ⋅ 2012/02/06 ⋅ 0

Phalcon7 增加逻辑处理类

拥有方法: 、、、以及静态方法: 通过设定 既可以通过设置控制方法的参数来实例化逻辑类。

朱宗鑫1 ⋅ 2016/11/03 ⋅ 0

phalcon异常处理

开发情况下 ,有异常直接抛出,方便调试。而在生产环境则不能暴露异常信息,此时需要对异常进行拦截并显示友好页面。 两种方式捕获异常: 通过dispatcher事件 通过一个简单的例子来展示一下:...

吾爱 ⋅ 2016/08/08 ⋅ 0

struts 启动源码分析

我测试用的版本是struts-2.2.3.1 struts启动是通过过滤器实现的,配置在web.xml中。最简单的配置如下 <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp9" version="2.4" xmlns="......

jiangtao ⋅ 2012/02/10 ⋅ 0

Egret之自定义事件

验证:谁发送,谁接收Event : EventDispatcher: 测试代码: 结果: Aonaufly 发送的 , Ainy是不会触发的 , 切记。。。。。。

Aonaufly ⋅ 2017/12/30 ⋅ 0

web.xml里中的作用

2.4版本的servlet规范在部属描述符中新增加了一个<dispatcher>元素,这个元素有四个可能的值:即REQUEST,FORWARD,INCLUDE和ERROR,可以在一个<filter-mapping>元素中加入任意数目的<dispatch...

wxyplj ⋅ 2011/03/18 ⋅ 0

Akka Types of dispatchers

Akka Types of dispatchers There are 4 different types of message dispatchers: • Dispatcher – This is an event-based dispatcher that binds a set of Actors to a thread pool. It ......

秋风醉了 ⋅ 2015/01/13 ⋅ 0

servlet转发到struts2问题,找不到路径

默认情况下servlet或者jsp页面转发到struts2会出现找不到路径的错误,需要在web.xml文件中配置struts映射的地方添加FORWARD声明,如下: <filter-mapping> <filter-name>struts2</filter-na...

Sobey ⋅ 2014/07/29 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 33分钟前 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 53分钟前 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部