当前位置: 首页 > news >正文

【Solr 学习笔记】Solr 源码启动教程

Solr 源码启动教程

本教程记录了如何通过 IDEA 启动并调试 Solr 源码,从 Solr9 开始 Solr 项目已由 ant 方式改成了 gradle 构建方式,本教程将以 Solr 9 为例进行演示,IDE 选择使用 IntelliJ IDEA。
Solr github 地址:https://github.com/apache/solr
JDK 版本:jdk17
关于系统版本可以参考:https://solr.apache.org/guide/solr/latest/deployment-guide/system-requirements.html

下载 Solr 源码并导入到 IDEA 中

可以从 github 上 clone 下载 java 源码:

git clone git@github.com:apache/solr.git 
# git clone https://github.com/apache/solr.git

亦或者下载相应版本的 java 源码包,如下图所示:
在这里插入图片描述

下载或 clone 好后,用 IDEA 打开 solr 源码,由于现在 Solr 使用 gradle 构建,IDEA 会自动识别 gradle 项目并进行加载,加载好后如下:
在这里插入图片描述
可以在项目的根目录下运行 ./gradlew dev 会构建 Solr 的开发发行版,其会在项目的 solr/packaging 目录下生成 build 目录,如下所示:

我们可以在 help 目录下查看一些关于项目的帮助说明,比如在 formatting.txt 中,如下所示:
在这里插入图片描述
提到了项目使用了 goole-java-format 来风格化代码,所以如果更改 Solr 源码后,我们可以使用 ./gradlew tidy 来风格化代码,亦或者 IDEA 安装 goole-java-format 插件并应用于 Solr 项目。

运行 StartSolrJetty 启动 Solr 服务(非 SolrCloud 方式运行)

如果我们不以 SolrCloud 的方式启动 Solr 服务,我们可以修改 StartSolrJetty 来启动项目,具体做法如下:

  1. 定义 SolrHome 目录
    可以在本地电脑选择一个目录作为 SolrHome,SolrHome 是指 Apache Solr 的主目录,它是 Solr 实例运行的基础环境和配置的中心位置。这个目录包含了所有关键的配置文件、库文件、日志以及包含各个 Solr Core 数据的目录。
    比如我创建了本地目录 /Workspace/SolrHome/Solr9/standalone,之后把项目的solr/server/solr/solr.xml 文件拷贝至该目录下,如下所示:
    在这里插入图片描述
  2. 定义 SolrCore 目录
    之后我们在 /Workspace/SolrHome/Solr9/standalone 中创建一个 core 目录,把 solr/server/solr/configsets/_default/conf 的内容拷贝至该目录下,如下所示:
    在这里插入图片描述
    这里我创建了一个 core_default 目录,并把源码提供的 _default 的配置拷贝了到了这个目录下,这个目录作为演示的 Solr Core 目录。

什么是 Solr Core?
Solr Core 是 Apache Solr 中的一个基本构建块,它代表一个单独的可搜索的文档集合。每个 Solr Core 都包含其自己的索引文件、配置文件和与之相关的处理逻辑。这使得 Solr 能够在同一个 Solr 实例中同时运行多个搜索应用,每个应用拥有不同的数据和配置,但共享相同的资源。


Solr Core 的目录结构
Solr Core 的目录结构是 Solr 应用中管理索引和配置的关键部分。每个 Core 目录通常包含若干关键文件和子目录,这些组成部分确保了 Solr 能够高效地处理搜索请求和索引操作。

Solr Core 目录结构的关键组成部分:

  1. conf/:
    • solrconfig.xml:控制 Solr Core 的操作和行为,包括搜索组件、请求处理器等。
    • schema.xml 或 managed-schema:定义索引中的字段和类型,是索引创建和查询的基础。
    • stopwords.txt:列出在索引过程中将被忽略的词汇,有助于优化搜索效率和准确性。
    • synonyms.txt:定义搜索中使用的同义词,增强搜索的灵活性和深度。
  2. data/:
    • 存放实际的索引数据,由 Lucene 管理,包括但不限于文档数据、索引文件等。
    • 这个目录的内容通常是动态变化的,随着文档的增加、更新和删除而更新。
  3. lib/:
    • 可选的目录,包含 Core 特定的 Java 类库文件。如果某个 Core 需要特殊的库而不是共享 Solr 实例中的库,则会使用这个目录。
  4. lang/:
    • 可选的目录,包含支持多语言处理的配置文件,如语言分析器等。
  5. logs/:
    • 可选的目录,某些配置下 Solr Core 可能会在这里生成特定的日志文件。

功能和用途:

  • conf/ 目录是 Core 配置的核心,影响索引结构和搜索行为的所有方面。
  • data/ 目录是索引和搜索操作的物理基础,直接关联到性能和存储。
  • lib/ 和 lang/ 目录提供了扩展性和灵活性,使得每个 Core 能够根据特定需求定制功能。
  1. 修改 StartSolrJetty 类,并启动
    在项目中找到 StartSolrJetty.java 这个类,如下图所示:

    我们需要对这个类的main方法做简单的修改,具体代码如下:
    public static void main(String[] args) {// System.setProperty("solr.solr.home", "../../../example/solr");// 这里需要填写之前创建的 SolrHome 的绝对路径System.setProperty("solr.solr.home", "/Workspace/SolrHome/Solr9/standalone");Server server = new Server();ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory());// Set some timeout options to make debugging easier.connector.setIdleTimeout(1000 * 60 * 60);connector.setPort(8983);server.setConnectors(new Connector[] {connector});WebAppContext bb = new WebAppContext();bb.setServer(server);bb.setContextPath("/solr");// bb.setWar("webapp/web");// 这里需要填写 Solr 源码的 `solr/webapp/web` 的绝对路径bb.setWar("/Workspace/source-code/solr/solr/webapp/web");//    // START JMX SERVER//    if( true ) {//      MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();//      MBeanContainer mBeanContainer = new MBeanContainer(mBeanServer);//      server.getContainer().addEventListener(mBeanContainer);//      mBeanContainer.start();//    }server.setHandler(bb);try {System.out.println(">>> STARTING EMBEDDED JETTY SERVER, PRESS ANY KEY TO STOP");server.start();while (System.in.available() == 0) {Thread.sleep(5000);}server.stop();server.join();} catch (Exception e) {log.error("failed to start", e);System.exit(100);}}
    
    在代码中,我们需要指定 SolrHome 的绝对路径以及 Solr 的 webapp/web 的绝对路径,webapp/web 目录对应项目目录如下:

    之后运行启动这个类:
    在这里插入图片描述
    浏览器访问:http://localhost:8983/solr,页面如下:
    在这里插入图片描述
  2. 创建 Core
    如下所示:
    在这里插入图片描述
    我们添加一个 Core,这里的 instanceDir 就是刚才我们创建的 Core 目录的名称,添加好后,如下所示,可以看到添加的 Core 名称为 example_demo 同时会在 Core 目录下多出了 data 索引目录以及 core.properties Core 属性文件
    在这里插入图片描述
    在如下页面可以运行查询:
    在这里插入图片描述
  3. 断点调试 Solr 源码
    如果 StartSolrJetty 是以 debug 方式运行的,你可以在项目中打断点调试 Solr 源码,Solr 的请求入口在 SolrDispatchFile.doFilter 处,如下所示:
    在这里插入图片描述

以 SolrCloud 方式运行 Solr 源码

如果想通过 SolrCloud 方式运行并调试 Solr 源码,我们需要创建一个运行应用,具体操作如下所示:

  1. 运行 ./gradlew dev 构建 Solr 开发发行版
    在项目中我们可以运行 ./gradlew dev 构建 Solr 开发发行版,或者在 IDEA 中,在 gradle 面板运行,如下图所示:

    运行成功后,会在 solr/server/build 目录下生成 packaging 目录,如下所示:

  2. 引入 start.jar 依赖项
    上面打包后的目录可以看到有一个 start.jar jar 包,打开项目结构,选择 server 模块,将这个 jar 包添加到依赖项中,如下所示:
    在这里插入图片描述

  3. 新建 solrcloud 应用
    在 IDEA 右上角,如下图所示:
    在这里插入图片描述
    选择 Edit Configurations,之后添加一个 Application 如下所示:

    按下图所示编辑应用:
    在这里插入图片描述
    之后选择 Modify options -> Add VM options
    在这里插入图片描述
    并在 VM options 中添加如下内容:

    -DzkHost=127.0.0.1:2181/solr9
    -Dsolr.jetty.host=0.0.0.0
    -Djetty.port=8983
    -Duser.timezone=UTC
    -Djetty.home=/Workspace/source-code/solr/solr/server
    -Dsolr.solr.home=/Workspace/SolrHome/Solr9/SolrHome_1
    -Dsolr.install.dir=/Workspace/source-code/solr/solr
    -Dsolr.log.dir=/Workspace/SolrHome/Solr9/logs/solr_1
    -Dsolr.log=/Workspace/SolrHome/Solr9/logs/solr_1/solr.log
    -Dlog4j.configurationFile=file:/Workspace/source-code/solr/solr/server/resources/log4j2.xml
    

    注意上面启动参数的路径要改成你自己的,而且要确保你本地是有启动 ZooKeeper 的,上面启动项的含义如下:

    启动项的详细解释:

    1. -DzkHost=127.0.0.1:2181/solr9
      • 指定 Solr 连接到的 ZooKeeper 主机和端口。此属性对于 SolrCloud 模式是必需的,因为它协调集群状态。127.0.0.1:2181 表示 ZooKeeper 运行在本地机器的 2181 端口上,/solr9 是 Solr 使用的 ZooKeeper 的 chroot 路径,它将所有 Solr 相关的数据隔离在这个路径下。
    2. -Dsolr.jetty.host=0.0.0.0
      • 设置 Jetty 服务器绑定的 IP 地址。使用 0.0.0.0 表示接受所有网络接口上的连接,使得任何远程机器都可以访问此 Solr 实例。
    3. -Djetty.port=8983
      • 指定 Jetty 服务器监听的端口号。8983 是 Solr 默认的端口号。
    4. -Duser.timezone=UTC
      • 设置运行 Solr 进程的时区为协调世界时(UTC)。这有助于确保时间的统一性,尤其是在多时区的环境中操作数据时。
    5. -Djetty.home=/Workspace/source-code/solr/solr/server
      • 指定 Jetty 的安装目录。这是 Jetty 服务器寻找其配置文件和库文件的地方。
    6. -Dsolr.solr.home=/Workspace/SolrHome/Solr9/SolrHome_1
      • 设置 Solr 的主目录(SolrHome),Solr 将从这个目录加载其配置文件、核心等信息。
    7. -Dsolr.install.dir=/Workspace/source-code/solr/solr
      • 指定 Solr 的安装目录,Solr 会在这个目录下查找它的一些核心库文件。
    8. -Dsolr.log.dir=/Workspace/SolrHome/Solr9/logs/solr_1
      • 设置 Solr 日志文件的存储目录。这是 Solr 存放日志文件的位置,有助于日志管理和故障排查。
    9. -Dsolr.log=/Workspace/SolrHome/Solr9/logs/solr_1/solr.log
      • 设置 Solr 的日志文件路径。指定具体的日志文件名称和路径,通常用于定制日志文件的存储位置和命名。
    10. -Dlog4j.configurationFile=file:/Workspace/source-code/solr/solr/server/resources/log4j2.xml
      • 指定 Log4j 2 的配置文件路径。这个文件定义了日志管理的配置,包括日志级别、输出格式和输出目的地等。

    之后选择 Working directory 为 项目的 solr/server/build/packaging 目录,如下所示:
    在这里插入图片描述
    填写 Program arguments--module=http,配置完毕如下所示:
    在这里插入图片描述
    点击应用并确定。

  4. 运行调试程序
    如下所示以 Debug 方式运行
    在这里插入图片描述
    由于我本地启动了 ZooKeeper,solr9 路径如下:
    在这里插入图片描述
    启动 solrcloud 后,会初始化一些配置到 ZooKeeper 中,如下所示:
    在这里插入图片描述
    程序启动成功,同时:

    Zookeeper 节点写入了一些数据
    访问 http://localhost:8983/solr 页面如下:
    在这里插入图片描述
    可以看到 SolrCloud 模式下页面有些许不同,当然我们也可以在 SolrDispatchFilter 中打断点,断点依旧会进来:
    在这里插入图片描述

SolrCloud 模式下上传配置和创建 Collection

此时由于 Zookeeper 中没有 Collection 的配置所以此时我们只能创建 _default 配置的 Collection,此时我们可以运行 Solr 代码的 ZkCLImain 方法把我们本地的 Collection 配置上传至 Zookeeper 中。
如下所示:
在这里插入图片描述
源码中我们找到 org.apache.solr.cloud.ZkCLI 这个类,运行 main 方法后,控制台会打印出使用帮助,由此可知如何上传配置,比如我本地有一个 MOVIE 的配置文件,如下所示:

这时,我们需要编辑 ZkCLI 的程序参数,在程序启动参数(Program Arguments)中填写如下内容:
在这里插入图片描述
之后运行程序,访问 Zookeeper,如下所示,可以看到配置文件已上传到指定的 ZK 目录下
在这里插入图片描述
在创建 Collection 的页面上也可同时看到有了 MOVIE 的选项:
在这里插入图片描述

相关文章:

【Solr 学习笔记】Solr 源码启动教程

Solr 源码启动教程 本教程记录了如何通过 IDEA 启动并调试 Solr 源码,从 Solr9 开始 Solr 项目已由 ant 方式改成了 gradle 构建方式,本教程将以 Solr 9 为例进行演示,IDE 选择使用 IntelliJ IDEA。 Solr github 地址:https://gi…...

Java中的事件驱动编程模型

Java中的事件驱动编程模型 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我将为大家介绍Java中的事件驱动编程模型。事件驱动编程模型是一种以事件为核心驱…...

Python 语法基础一

1.变量 python 中变量很简单,不需要指定数据类型,直接使用等号定义就好。python变量里面存的是内存地址,也就是这个值存在内存里面的哪个地方,如果再把这个变量赋值给另一个变量,新的变量通过之前那个变量知道那个变量…...

从零开始:Spring Boot 中使用 Drools 规则引擎的完整指南

规则引擎作用 规则引擎主要用于将业务逻辑从应用程序代码中分离出来,提高系统的灵活性和可维护性。规则引擎通过预定义的规则来处理输入数据并做出相应的决策,从而实现业务逻辑的自动化和动态调整。 例如 门店信息校验:美团点评在门店信息…...

工业边缘计算网关

1 介绍 HINETG系列边缘计算网关(Linux操作系统),是华辰智通的—款面向工业现场设备接入、数据采集、设备监控的工业级边缘计算网关。采用ARM Cortex-A7 800MHz高性能CPU,拥有以太网、串口、CAN口、IO口等丰富的接口,支持以太网、…...

【C++ 初阶路】--- 类和对象(末)

目录 一、const成员1.1 取地址及const取地址操作符重载 二、再谈构造函数2.1 构造函数体赋值2.2 初始化列表2.3 explicit关键字 三、static成员3.1 概念3.2 特性 四、友元4.1 友元函数4.2 友元类 五、内部类六、匿名对象 一、const成员 将const修饰的“成员函数”称之为const成…...

bable 【实用教程】

简介 bable 用于将 ES6 的语法编译为 ES5 只关心语法,不关心 API 是否正确。不处理模块化(webpack 会处理) 搭建开发环境 安装相关的包 npm i babel/cli babel/core babel/preset-env新建文件 .babelrc,内容为 { "presets…...

Android中使用startActivityForResult启动活动

Android中使用startActivityForResult启动活动 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在本文中,我们将深入探讨Android开发中使用startActi…...

NineData和华为云在一起!提供一站式智能数据库DevOps平台

以GuassDB数据库为底座 NineData和华为云一起 为企业提供 一站式智能数据库DevOps平台 帮助开发者 高效、安全地完成 数据库SQL审核 访问控制、敏感数据保护等 日常数据库相关开发任务 NineData 智能数据管理平台 NineData 作为新一代的云原生智能数据管理平台&#xf…...

深入解析 Redisson分布式锁看门狗机制

一、Redisson分布式锁概述 1.1 分布式锁的意义 在分布式系统中,多个节点可能同时访问共享资源,导致数据不一致或竞态条件。分布式锁通过协调不同节点对共享资源的访问,确保数据的一致性和并发访问的安全性。 1.2 Redisson分布式锁的优势 …...

Apache Arrow 和数据的未来:开放标准推动人工智能发展

Apache Arrow 是一种开源列式内存格式,适用于平面数据和分层数据。在现代数据湖中,开放数据格式(如 Apache Arrow)位于现代对象存储的存储层中。这些格式成为对象存储中的对象。 在最新版本中,Apache Arrow 宣布计划从…...

Vue项目生产环境的打包优化

Vue项目生产环境的打包优化 前言 在这篇文章我们讨论Vue项目生产环境的打包优化,并按步骤展示实际优化过程中的修改和前后对比。 背景 刚开始的打包体积为48.71M 优化 步骤一:删除viser-vue viser-vue底层依赖antv/g2等库一并被删除,…...

oracle数据库之使用Java程序调用存储过程(二十四)

在Oracle数据库中,你可以使用Java程序来调用存储过程。这通常涉及几个步骤:首先,确保你的Java环境能够连接到Oracle数据库;其次,使用JDBC(Java Database Connectivity)来调用存储过程。 以下是…...

西电953总分第一、专业课第一考研上岸

今年上岸西电杭研院网信院网络与信息安全专业,总分370分,专业课116分,分别是总分第一名,专业课第一名,感谢研梦的953叶学姐,非常负责,本硕大佬学姐,当年密码学38分选手(满…...

pytorch-模型训练

目录 1. 模型训练的基本步骤1.1 train、test数据下载1.2 train、test数据加载1.3 Lenet5实例化、初始化loss函数、初始化优化器1.4 开始train和test 2. 完整代码 1. 模型训练的基本步骤 以cifar10和Lenet5为例 1.1 train、test数据下载 使用torchvision中的datasets可以方便…...

Linux /proc目录总结

1、概念 在Linux系统中,/proc目录是一个特殊的文件系统,通常被称为"proc文件系统"或"procfs"。这个文件系统以文件系统的方式为内核与进程之间的通信提供了一个接口。/proc目录中的文件大多数都提供了关于系统状态的信息&#xff0…...

【JavaEE】浅谈线程(二)

线程 线程的常见属性 线程属性可以通过下面的表格查看。 •ID 是线程的唯⼀标识,不同线程不会重复 • 名称是各种调试⼯具⽤到(如jconsoloe) • 状态表示线程当前所处的⼀个情况,下⾯我们会进⼀步说明 • 优先级高的线程理论上来…...

爬虫:爬取知乎热榜一级评论及回答2024不包含翻页

一、先上结果(注:本文仅为兴趣爱好探究,请勿进行商业利用或非法研究,负责后果自负,与作者无关) 1、爬标题及其具体内容 2、抓标题下的对应回答 3、爬取对应一级评论 二、上流程 1、获取cookies(相信哥哥姐姐…...

AI 编程探索- iOS动态标签控件

需求分析: 标签根据文字长度,自适应标签居中显示扩展 超过内容显示范围,需要换行显示,且保持居中显示 AI实现过程 提问: 回答: import UIKit import SnapKitclass DynamicLabelsContainerView: UIView…...

计算机网络——数据链路层(数据链路层概述及基本问题)

链路、数据链路和帧的概念 数据链路层在物理层提供服务的基础上向网络层提供服务,其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。 链路(…...

【前端】前端权限管理的实现方式:基于Vue项目的详细指南

前端权限管理的实现方式:基于Vue项目的详细指南 在Web开发中,前端权限管理是一个确保应用安全性和优化用户体验的关键部分。本文将详细介绍前端权限管理的几种实现方式,并通过Vue项目中的代码示例来演示具体实现方法。 前端权限管理的基本实…...

MySQL数据库基础练习系列——教务管理系统

项目名称与项目简介 教务管理系统是一个旨在帮助学校或教育机构管理教务活动的软件系统。它涵盖了学生信息管理、教师信息管理、课程管理、成绩管理以及相关的报表生成等功能。通过该系统,学校可以更加高效地处理教务数据,提升教学质量和管理水平。 1.…...

windowns server2016服务器配置php调用powerpoint COM组件

解决问题:windowns server2016服务器配置php调用powerpoint COM组件 环境: windows server2016 宝塔(nginxmysqlphp7.2) IIS 搭建宝塔: 下载地址:https://www.bt.cn/download/windows.html ​ 安装使用&…...

Git之checkout/reset --hard/clean -f区别(四十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...

MySQL数据库基础练习系列:科研项目管理系统

DDL CREATE TABLE Users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名,password VARCHAR(255) NOT NULL COMMENT 密码,gender ENUM(男, 女) NOT NULL COMMENT 性别,email VARCHAR(100) UNIQUE COMMENT 邮箱 …...

算法设计与分析--考试真题

分布式算法试题汇总选择题简答题算法题 2013级试题2019级试题2021年秋考卷 根据考试范围找相应题目做。 分布式算法试题汇总 选择题 下述说法错误的是___ A 异步系统中的消息延迟是不确定的 B 分布式算法的消息复杂性是指在所有合法的执行上发送消息总数的最大值 C 在一个异步…...

【鸿蒙学习笔记】页面和自定义组件生命周期

官方文档:页面和自定义组件生命周期 目录标题 [Q&A] 都谁有生命周期? [Q&A] 什么是组件生命周期? [Q&A] 什么是组件?组件生命周期 [Q&A] 什么是页面生命周期? [Q&A] 什么是页面?页面生…...

ASPICE与ISO 21434:汽车软件与网络安全标准的协同与互补

ASPICE(Automotive SPICE)与ISO 21434在汽车行业中存在显著的相关性,主要体现在以下几个方面: 共同目标: ASPICE和ISO 21434都旨在提高汽车系统和软件的质量、可靠性和安全性。ASPICE关注汽车软件开发过程的成熟度和…...

视频格式转换方法:如何使用视频转换器软件转换视频

众所周知,目前存在许多不同的视频和音频格式。但我们的媒体播放器、移动设备、PC 程序等仅兼容少数特定格式。例如,如果不先将其转换为 MP4、MOV 或 M4V 文件,AVI、WMV 或 MKV 文件就无法在 iPhone 上播放。 视频转换器允许您将一种视频格式…...

vim操作小诀窍:快速多行添加注释

在使用vim编译python代码的时候,经常碰到需要将一段代码注释的情况,每次都要按“向下” “向左”按钮,将光标移到句首,然后再键入#井号键。如果行数较多,则操作相当繁琐。 vim里面有将一段文字前面加#注释的方法&#…...

淄博营销网站建设公司/如何进行网站性能优化

Nginx 配置高可用的集群 配置高可用的准备工作 (1)需要两台服务器 192.168.56.10 和 192.168.56.11(VirtulBox搭建虚拟机集群环境(Vagrant )) (2)在两台服务器安装 nginx&#xff0…...

网站的管理权限有什么用/网站制作策划

误区: 1.基础最重要,所以什么英语数学应该努力学好。 2.交际比技术更重要 3.刻苦勤奋最重要 4. 多学几门 我的看法: 1. 废话。假如你是个没有基础的人,你去学习编程当然会有很多不足的地方。但是如果你觉得基础很重要,…...

网站建设,从用户角度开始/媒介平台

很多时候开发项目需要不一样的窗口大小来观察最后呈现的结果 自己拖拽的时候会发现拖拽的不准。。。之前公司项目需要21:9这种比例。。。 后来发现ue提供这种简单方便的工具 1.设置 Play 模式改为 New Editor Window (会自动打开一次莫着急关了就行) 2.打开Editor Preferenc…...

石家庄小学网站建设/广西壮族自治区在线seo关键词排名优化

电脑升级到WIN10后多出很多小工具,不想用又删不掉。windows上载中心就是这样,怎么操作都卸不掉。我从网上百度到了大神的方法,真的很有效。推荐给大家。 步骤一:打开任务管理器(快捷键:CtrlshiftESC&#x…...

金藏源电商网站建设多少钱/腾讯企点下载

要想在你的view或者viewController中实现长按弹出菜单栏你必须要调用becomeFirstResponder方法,其次要实现canBecomeFirstResponder方法,并返回YES. #import "ViewController.h"interface ViewController ()property(nonatomic,strong)UILabel…...

凡客网站网址/国际大新闻最新消息

php获取url中的参数信息,是PHP面试过程中常见的考点之一,也是我们日常项目开发过程中,经常需要实现的一个功能,我们可以通过PHP中parse_url等相关函数来实现。那么对于PHP新手来说,具体怎么实现可能有一定的难度&#…...