idea 打jar包、lib文件夹

idea目录文件

idea四层级结构

idea操作Java文件的基本单位:项目(Project)。对应四级结构
第1层级架构:项目(project)

在 IntelliJ IDEA 中Project是最顶级的结构单元,然后就是Module,一个Project可以有多个Module,模块之间彼此可以相互依赖

项目project包含:
    .idea文件夹(项目的配置文件)
     out文件夹(第2层级对应的所有字节码文件)
     模块文件夹(第2层级架构)

第2层级架构:模块(moudle)

在一个项目中,每个模块都可以使用特定的SDK或继承在项目级别定义的SDK。

模块moudle包含:
     src文件夹(存储第3层级架构内容)
     模块名.iml 文件(模块配置文件)
模块上右键-Open Module settiongs(可以新建模块,移除模块,导入模块)

第3层级架构:包(Package)
包的含义:多级文件夹
包的好处:1.对程序文件管理分类。2.有效避免重名的文件    

包中包含:
    java程序(第4层架构)

包的注意:如果程序在包中,必须在第4层架构进行包的声明
包的声明:
    1.包名就是公司域名倒序+功能 如:com.atguigu.idea
    2.格式:package 包名;
    3.命名规范:
         一个单词:单词全部小写(一般没有)
         多个单词:使用.进行间隔,一个单词就是一级文件夹

第4层级架构:.java文件(类文件)

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Helloworld"); 
   }
}

.iml文件

.iml:配置信息之意, infomation  of  module

iml文件是idea自己创建的模块文件,用于java应用开发,存储一些模块相关的信息。每个模块都有一个iml文件。 


.idea目录

.idea目录:存放项目的配置信息。包括数据源,类库,项目字符编码,历史记录,版本控制信息等


working dir目录

编辑配置


lib文件夹

lib文件夹

lib文件夹用于存放项目所依赖的第三方依赖包(jar文件),比如网路请求库,数据库连接等等。以便能够正确地引用和使用这些库。

lib文件夹通常位于Java项目的根目录下。在一个标准的Java项目中,lib文件夹下会包含多个jar文件,每个jar文件对应一个第三方库。

jar文件实际上是class文件的zip压缩存档

如下,创建LibTest的一个空工程,并手动新建lib文件夹,把mysql的包放进去

public class Demo {
    public static void main(String[] args) throws Exception {
        String className = "com.mysql.jdbc.Driver";
        //1. 注册驱动
        Class clazz = Class.forName(className);
        Driver driver = (Driver) clazz.newInstance();
        DriverManager.registerDriver(driver);
        //2. 获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/spring-boot-demo?serverTimezone=UTC&useSSL=false";
        String user = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, user, password);
        //3.获取数据库操作对象
        Statement stmt = conn.createStatement();
        //4.执行查询 SQL语句,返回结果集
        String username = "zhangsan";
        String sql = "select * from t_user where  username= '" + username + "'";
        ResultSet rs = stmt.executeQuery(sql);
        //5.通过索引来遍历读取结果集
        while (rs.next()) {
            int userId = rs.getInt(1);
            String name = rs.getString(2);
            String balance = rs.getString(3);
            System.out.println("userId:" + userId + " 姓名:" + name + " 余额:" + balance);
        }
        //6.资源的释放,讲道理要写到finally语句块中
        rs.close();
        stmt.close();
        conn.close();
    }
}

此时还没有使用idea工具把mysql-connector-java-5.1.47.jar添加到项目的classpath中,则会报错


引用lib文件夹中的库

当我们在Java代码中需要使用lib文件夹中的库时,首先需要将这些库添加到项目的classpath中。classpath是Java程序在运行时搜索类和资源文件的路径。

方式一: 给模块添加lib文件夹

点击jars or directiories

选择lib文件夹,点击ok,点击apply应用即可

方式二:添加项目级别的lib

在lib文件夹上右键-Add as Library…构建项目所需的jar包

Level级别有三个,选择默认的点击ok

  • Module Library:模块级别,只能本模块使用,别的模块看都看不见
  • Project Library(默认选中):项目级别,该项目下所有的模块均能看见和选中使用
  • Global Library:全局级别,任何项目均可看见和使用

再次运行Demo类,运行成功如下:


spring-boot-maven-plugin

打包插件用的是spring-boot-maven-plugin,这个插件会把项目中的代码和相关依赖一起打包成一个jar包,我们只需哪到这个jar包发布到服务器上即可,很方便

可以通过压缩工具查看jar包的文件目录,找到BOOT-INF下lib目录,可以看到里面有很多依赖包,然后其他的文件就是一些class文件和配置文件


Native Library Locations

Java是一种高级语言,其运行在Java虚拟机(JVM)上。而其他语言编写的库文件需要运行在操作系统上。为了能够在Java程序中加载这些库文件,需要通过Java Native Interface (JNI)来实现Java和其他语言的交互。

JNI是Java提供的一种机制,用于在Java程序中调用C、C++等其他语言编写的库文件。在Java中,通过System.loadLibrary()方法来加载库文件

当我们调用System.loadLibrary()方法时,Java会搜索java.library.path系统属性所指定的路径来查找库文件。如果找不到对应的库文件,就会抛出java.lang.UnsatisfiedLinkError异常。

在IDEA中,可以通过设置VM options来配置<code>-Djava.library.path</code>。以下是具体的操作步

System.out.println(System.getProperty("java.library.path"));

将.dll文件路径如图配置在VM option中即可.

路径结构类似于-Djava.library.path=F:/pro/znny_syx_standard/lib   

其中-Djava.library.path=为固定写法


Project Structure

参考:玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定-idea project structure (51cto.com)

Project Structure顾名思义,是针对Project维度的结构视窗.

顶部菜单File -> Project Structure..打开一个Project的结构展示窗口

可以看到它左边的“菜单栏”,共分为三个part:

  • Project Settings:项目设置(最重要),本文详解
  • Platform Settings:平台设置,也叫全局设置。用于管理SDK们(如JDK、Kotlin的SDK等)、全局库。

一般来讲,全局的JDK都会配置在此处,比如我因为经常要做多版本尝试,就管理了多个JDK版本


Project页

此视窗可以看到Project本身的基础信息。如:名称、SDK版本、语言等级等等,比较简单。

1.为何是SDK版本而不是JDK版本?

答:因为IntelliJ IDEA是JVM平台IDEA,不仅仅支持Java还有其它语言如Kotlin,所以写成SDK更抽象

2.为何指定了SDK还要指定语言等级?

答:因为SDK版本并不直接决定语言等级。如你用的JDK 11,但依旧可以把语言等级调为8来进行编译/运行。这是集成开发环境的优势所在,轻松对多环境进行定制化支持

3.SDK和语言等级Project都可指定,作为全局默认

这些配置Module默认集成,但可自行修改自己的。比如module 1使用Java 5编译,module 2使用Java 11编译,这是允许的


Module页

Module作为实际存在形式,所有的源代码、配置、依赖等都在这里,

每个模块都能独立管理着自己的依赖,这种关系在模块自己的.iml文件中记录着。

知识点:

  1. Project创建时默认会创建一个同名的Module模块
  2. Module默认沿用Project的SDK、语言等级等设置,当然也可自己指定
  3. 每个Module可自行管理依赖,可以是二方库、三方库......
  4. 本模块的依赖情况默认存储在项目的{moduleName}.iml文件里

idea模块(module) 是如何实现引用的,若A模块需要使用B模块里的东西可以直接在 A模块组织文件 A.iml 中添加一句

<orderEntry type="module" module-name="B模块名字" />

模块如何依赖其它Module

添加Dependency依赖时,请选择Module Dependency...选项:

点击ok,搞定了。对应的,此依赖关系也会体现在hello-service.iml这个配置文件上:


Libraries页

当某Library是所有/大部分模块都需要的依赖时,就可以上升为Project级别的依赖,抽取到Libraries标签页来统一管理。

选择作用的模块:

当然喽,你也可以一个都不选(点击cancle),那么该jar只是被创建了,而不作用于任何module模块。


Artifacts页

IDEA如何打Jar包?如何打War包? 来,上菜~

执行完此命令后,在Output Directory里就能看到hello.jar这个打包好的文件啦。


.classpath文件

在使用eclipse或者myeclipse进行java项目开发的时候,每个project(工程)下面都会有一个.classpath文件,那么这个文件究竟有什么作用?

如果把该文件删除,则eclipse不能讲该工程识别为一个正常的java工程,仅仅当做普通的文件夹而导致不能正常运行。

idea中打jar包

创建Artifact

jar (Java Archive File),翻译过来就是java的档案文件。在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的,包含了JAR包的描述信息、主类的全类名等信息。

File -->Project Structure -->Artifacts --> Jar --> From module with dependencies.如下图

打开后,填写完成 点击ok

Module下拉框中选中需要打包的Module,

Main Class 框中选择主类。

Directory for META-INF/MENIFECT.MF   这里是输入一个路径,用于保存MENIFECT.MF文件,使用默认的路径即可

Include tests 如果选中,打包时将会把测试用例(Tests)类也打包进去。通常不用选中。


JAR files from libraries

JAR files from libraries有两个选项:

第一个是打完包就是一个 jar 包;
第二个打完包,是一个 jar 包+外带你项目所用的 jar 包

extract to the target JAR

表示将第三方JAR包内容都解压并统一打包到最后生成的JAR包。如下图

如果你只是希望打包Module本身,可以选择“extract to the target JAR”;

-------------------------------

copy to the output directory and link via menifest   

表示将第三方JAR包内容拷贝到输出目录,并在manifest中添加对应的属性(生成的MANIFEST.MF会包含Class-Path属性)

如果希望打包Module的同时,也将第三方的JAR一起打包,可以选择“copy to the output directory and link via menifest”。


配置Artifact

Name 输入框中可以修改Artifact的名称(不是生成的jar文件的名称)。

Output directtory:jar包的输出目录idea会有默认,可自己在Output directtory去改

Output Layout

Output Layout 中,你可以添加或删除需要打包的内容。

只希望打包Module本身,我们并不需要那么多的jar,在Output Layout中把多余的“减掉”

再重新build,打包后就只包含这个Module的class,不会包含第三方JAR


修改生成的jar文件的名称

如果希望修改生成的jar文件的名称,需要右键点击Output Layout框中的根节点,选择rename,如下图:

打包后结果


Build Artifacts

配置工作完成后,就可以正式构建jar包了

Build --> Build Artifacts,选择下面的Build,就完成jar包构建输出了。


实际使用

java -jar命令

java -jar 命令用于运行可执行的JAR文件。它会自动查找JAR文件中的清单文件(MANIFEST.MF),并根据清单文件中的Main-Class属性指定的主类来启动应用程序。

以下是一些常用的java -jar命令的参数,让我们逐一了解它们的功能和用法。

-Xmx:指定Java堆的最大内存大小。例如,-Xmx512m表示将最大堆内存设置为512MB。通过调整堆内存大小,可以优化应用程序的性能和内存使用情况。
-Xms:指定Java堆的初始内存大小。例如,-Xms256m表示将初始堆内存设置为256MB。这个参数可以帮助您在启动应用程序时控制初始内存分配的大小。
-Xss:指定线程栈的大小。例如,-Xss1m表示将线程栈大小设置为1MB。线程栈用于存储线程的局部变量和方法调用信息。通过调整线程栈的大小,可以控制应用程序的并发性能和内存使用情况。
-XX:MetaspaceSize=256m参数,您可以指定元空间的初始大小为256MB。这意味着在应用程序启动时,虚拟机会预分配256MB的内存用于存储类的元数据。
-XX:MaxMetaspaceSize=:指定元空间的最大大小。元空间用于存储类的元数据信息。例如,-XX:MaxMetaspaceSize=256m表示将元空间的最大大小设置为256MB。适当设置元空间的大小可以避免类加载和元数据溢出的问题。
-D=:设置系统属性。例如,-Djava.library.path=/path/to/libs设置java.library.path系统属性为/path/to/libs。您可以使用这个参数来配置应用程序的一些属性,例如文件路径、日志级别等。
-verbose:class:打印类加载信息。使用这个参数可以了解应用程序在运行过程中加载的类的详细信息,包括类的名称、来源等。
-verbose:gc:打印垃圾回收信息。通过使用这个参数,您可以了解应用程序的垃圾回收情况,包括垃圾回收器的使用情况、回收的对象数量等。
-Dfile.encoding=:设置默认的文件编码。例如,-Dfile.encoding=UTF-8表示使用UTF-8编码来读取和写入文件。正确设置文件编码可以确保应用程序能够正确处理不同字符集的文本数据。

以上是一些常用的java -jar命令的参数,通过灵活运用这些参数,您可以对应用程序的性能、内存使用和系统属性进行优化和配置。


可执行的JAR

可以执行的 JAR 与 普通的 JAR 最直接的区别就是能否通过 java -jar 来执行。

如果一个 JAR 文件被当作可执行文件,则其中的 MANIFEST 文件需要指出该程序的主类文件

java -jar xxx.jar

这种模式比较简单,适用于所有的class/资源都打包到一个jar文件中的情况.

-------------------------------------

如把上面的LibTest模块打包成一个可执行jar包:

使用压缩软件打开LibTest.jar包,可以看到MANIFEST 文件如下:


lib目录下(第三方jar)

 将其余的第三方jar放入lib目录下,LibTest.jar只是源码包

直接运行是会报错的

怎么办呢?改变manifest.mf,如下添加lib/,再重新构建

更好的办法:借助编辑,

因为manifest 文件中的每一行都是 key-value 对应的:属性名开头,接着是 ":" ,然后是属性值,每行最多72个字符,如果需要增加,可以在下一行续行,续行以空格开头,以空格开头的行都会被视为前一行的续行。

可以使用压缩软件打开LibTest.jar,看到文件中Class-Path的改动确实生效了


META-INF目录

jar文件中有一个特定的目录来存放标签信息:META-INF目录,其中一个名叫manifest.mf的文件,它包含了jar文件的内容描述,在应用程序运行时向JVM提供应用程序的信息

  • MANIFEST.MF:这个 manifest 文件定义了与扩展和包相关的数据。

 从 MANIFEST 文件中提供的信息大概可以了解到其基本作用

  • JAR 包基本信息描述
  • Main-Class 指定程序的入口,这样可以直接用java -jar xxx.jar来运行程序
  • Class-Path 指定jar包的依赖关系,class loader会依据这个路径来搜索class


在命令行中使用classpath参数

如果你使用命令行编译和运行Java程序,可以使用-cp或-classpath参数来指定classpath

javac -cp .:lib/* com/example/Main.java
java -cp .:lib/* com.example.Main

上述命令中的.表示当前目录,lib/*表示lib文件夹下的所有jar文件。


jar包冲突

有时候引入的jar包中的包名类名与其他jar包中的包名类名相同,导致程序在编译或运行的时候无法正确引用想要的类

Intellij IDEA里怎样配置maven在编译时加入lib目录下的jar包

<build>

        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                    <compilerArguments>
                        <extdirs>project-demo\lib</extdirs>
                    </compilerArguments>
                </configuration>
            </plugin>
         </plugins>       

</build>

Spring Boot Actuator

使用 Spring Boot Actuator 来监控应用程序的健康状况和性能

1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、配置参数

添加依赖后,我们需要配置 Actuator 的一些参数。可以在 application.yml 或 application.properties 文件中添加以下配置:、

management:
  endpoints:
    web:
      exposure:
        include: "*"

上面的配置将所有 Actuator 的端点都暴露出来,以便我们可以使用它们来监控应用程序的健康状况和性能指标。我们也可以选择只暴露一部分端点,以便控制访问权限和保护应用程序的安全性。


3、默认Actuator 端点

使用 Actuator 端点来监控应用程序的健康状况和性能指标了。Spring Boot Actuator 提供了多个端点,每个端点都提供了不同的功能。

健康状况端点(health endpoint)用于获取应用程序的健康状况。它可以告诉我们应用程序是否正常运行,以及是否存在任何问题

implements Endpoint


4、默认Actuator 端点

  • 查看容器中所有的bean
    /actuator/beans
  • 查看web的url映射
    /actuator/mapping

Cursor - The AI-first Code Editor

- Ctrl/Command + K 描述你要做到事情,可以是各类代码编写

- Ctrl/Command + L 打开聊天对话框

- Ctrl/Command + K + 选中代码,可以翻译代码、运行模拟、查找bug

同时按下ctrl+shift+p输入configure display language,选择中文简体就可以了

v0 by Vercel

Vercel突然推出了v0.dev,用户通过语言描述就能生成精美UI页面,

CodeGeeX 智能编程助手

idea插件:codegeex

https://codegeex.cn/zh-CN/downloadGuide#idea


谷歌浏览器插件

Jquery

jQuery的api文档

jQuery API 中文文档 | jQuery API 中文在线手册 | jquery api 下载 | jquery api chm

web开发指南

Web 开发者指南 | MDN


入门上手教程

1、在桌面新建文件夹code,创建一个空文件manifest.json和main.html,创建img文件夹,里面存放icon.png(尽量保持在19像素大小)

2、manifest.json内容写入如下:

{
    "manifest_version": 2,
    "name": "lesson1",
    "version": "1.0",
    "description": "第一个插件demo",
    "author": "小羽毛",
    "icons": {
        "16": "img/icon.png",
        "48": "img/icon.png",
        "128": "img/icon.png"
    },
    "browser_action": {
        "default_icon": "img/icon.png",
        "default_title": "第一课插件",
        "default_popup": "main.html"
    }
}

3、main.html写入内容如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>啦啦啦</title>
</head>

<body>
    <h1>这是插件界面</h1>
</body>

</html>

在谷歌浏览器打开管理扩展程序,加载已解压的扩展程序,选择code文件夹

效果一:

效果二:

要想变得水平显示,在main.html中加入如下样式即可

<style>
    body {
        width: 500px;
        min-height: 100px;
    }
</style>

manifest.json

manifest.json是Chrome插件必不可少的文件,用来配置所有和插件相关的配置,必须放在根目录。其中,manifest_versionnameversion3个是必不可少的,descriptionicons是推荐的。

下面给出的是一些常见的配置项,均有中文注释,完整的配置文档请戳这里

{
	// 清单文件的版本,这个必须写,而且必须是2
	"manifest_version": 2,
	// 插件的名称
	"name": "demo",
	// 插件的版本
	"version": "1.0.0",
	// 插件描述
	"description": "简单的Chrome扩展demo",
	// 图标,一般偷懒全部用一个尺寸的也没问题
	"icons":
	{
		"16": "img/icon.png",
		"48": "img/icon.png",
		"128": "img/icon.png"
	},
	// 会一直常驻的后台JS或后台页面
	"background":
	{
		// 2种指定方式,如果指定JS,那么会自动生成一个背景页
		"page": "background.html"
		//"scripts": ["js/background.js"]
	},
	// 浏览器右上角图标设置,browser_action、page_action、app必须三选一
	"browser_action": 
	{
		"default_icon": "img/icon.png",
		// 图标悬停时的标题,可选
		"default_title": "这是一个示例Chrome插件",
		"default_popup": "popup.html"
	},
	// 当某些特定页面打开才显示的图标
	/*"page_action":
	{
		"default_icon": "img/icon.png",
		"default_title": "我是pageAction",
		"default_popup": "popup.html"
	},*/
	// 需要直接注入页面的JS
	"content_scripts": 
	[
		{
			//"matches": ["http://*/*", "https://*/*"],
			// "<all_urls>" 表示匹配所有地址
			"matches": ["<all_urls>"],
			// 多个JS按顺序注入
			"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
			// JS的注入可以随便一点,但是CSS的注意就要千万小心了,因为一不小心就可能影响全局样式
			"css": ["css/custom.css"],
			// 代码注入的时间,可选值: "document_start", "document_end", or "document_idle",最后一个表示页面空闲时,默认document_idle
			"run_at": "document_start"
		},
		// 这里仅仅是为了演示content-script可以配置多个规则
		{
			"matches": ["*://*/*.png", "*://*/*.jpg", "*://*/*.gif", "*://*/*.bmp"],
			"js": ["js/show-image-content-size.js"]
		}
	],
	// 权限申请
	"permissions":
	[
		"contextMenus", // 右键菜单
		"tabs", // 标签
		"notifications", // 通知
		"webRequest", // web请求
		"webRequestBlocking",
		"storage", // 插件本地存储
		"http://*/*", // 可以通过executeScript或者insertCSS访问的网站
		"https://*/*" // 可以通过executeScript或者insertCSS访问的网站
	],
	// 普通页面能够直接访问的插件资源列表,如果不设置是无法直接访问的
	"web_accessible_resources": ["js/inject.js"],
	// 插件主页,这个很重要,不要浪费了这个免费广告位
	"homepage_url": "https://www.baidu.com",
	// 覆盖浏览器默认页面
	"chrome_url_overrides":
	{
		// 覆盖浏览器默认的新标签页
		"newtab": "newtab.html"
	},
	// Chrome40以前的插件配置页写法
	"options_page": "options.html",
	// Chrome40以后的插件配置页写法,如果2个都写,新版Chrome只认后面这一个
	"options_ui":
	{
		"page": "options.html",
		// 添加一些默认的样式,推荐使用
		"chrome_style": true
	},
	// 向地址栏注册一个关键字以提供搜索建议,只能设置一个关键字
	"omnibox": { "keyword" : "go" },
	// 默认语言
	"default_locale": "zh_CN",
	// devtools页面入口,注意只能指向一个HTML文件,不能是JS文件
	"devtools_page": "devtools.html"
}

browser_action

通过配置browser_action可以在浏览器的右上角增加一个图标,一个browser_action可以拥有一个图标,一个tooltip,一个badge和一个popup

示例配置如下:

"browser_action":
{
	"default_icon": "img/icon.png",
	"default_title": "这是一个示例Chrome插件",
	"default_popup": "popup.html"
}

图标

browser_action图标推荐使用宽高都为19像素的图片,更大的图标会被缩小,格式随意,一般推荐png,可以通过manifest中default_icon字段配置,也可以调用setIcon()方法。


popup

popup是点击browser_action或者page_action图标时打开的一个小窗口网页,焦点离开网页就立即关闭,一般用来做一些临时性的交互。

popup可以包含任意你想要的HTML内容,并且会自适应大小。可以通过default_popup字段来指定popup页面,也可以调用setPopup()方法。

配置方式:

{
	"browser_action":
	{
		"default_icon": "img/icon.png",
		// 图标悬停时的标题,可选
		"default_title": "这是一个示例Chrome插件",
		"default_popup": "popup.html"
	}
}

需要特别注意的是,由于单击图标打开popup,焦点离开又立即关闭,所以popup页面的生命周期一般很短,需要长时间运行的代码千万不要写在popup里面。

后台页

新建后台页

在根目录下创建空文件background.html

文件内容写入如下

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>后台页</title>
</head>

<body>
    <h1>这是后台页</h1>
</body>

</html>

配置后台页

在Manifest中指定background域可以使扩展常驻后台。

background可以包含三种属性,分别是scriptspagepersistent

后台页,是一个常驻的页面,它的生命周期是插件中所有类型页面中最长的,它随着浏览器的打开而打开,随着浏览器的关闭而关闭,所以通常把需要一直运行的、启动就运行的、全局的代码放在background里面。

配置中,

如果指定了page属性,则Chrome会将指定的HTML文件作为后台页面运行。

也可以通过scripts直接指定一个JS,Chrome会自动为这个JS生成一个默认的网页:

persistent属性定义了常驻后台的方式——当其值为true时,表示扩展将一直在后台运行,无论其是否正在工作,默认值为true

{
	// 会一直常驻的后台JS或后台页面
	"background":
	{
		// 2种指定方式,如果指定JS,那么会自动生成一个背景页
		"page": "background.html"
		//"scripts": ["js/background.js"]
	},
}

与后台页交互

在main.html中,加如三个链接

    <div>
        <a href="#" id="openback">打开后台页</a>
        <a href="#" id="getbacktitle">获取后台页标题</a>
        <a href="#" id="callbackjs">调用后台页js</a>
    </div>

对应的方法如下:

$("#openback").click(e=>{
      window.open(chrome.extension.getURL("background.html"));
});

$("#getbacktitle").click(e=>{
    var a=chrome.extension.getBackgroundPage();
    alert(a.document.title)
});

调用后台页js

在main.html中

<a href="#" id="callbackjs">调用后台页js</a>

对应的js代码

$("#callbackjs").click(e=>{
    var bg=chrome.extension.getBackgroundPage();
    bg.callbackjs()
});

那后台页对象中为什么会有callbackjs()方法呢

在后台页对应的background.html中,引入后台页js

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

在background.js中定义了一个函数

function callbackjs(){
    alert("background.html")
}

 这样在页面中点击的时候,就会弹出如下效果


content-scripts

运行时机

设置 content scripts 时可以选择运行时机,设置 run_at 为

document_start(页面加载前)

document_idle(dom 加载完成)

document_end (页面加载完成)

三个不同的时机开始运行。

  • "document_start"表示在CSS文件之后,DOM构建或其他脚本运行之前,注入JS文件。
  • "document_end",表示在DOM构建结束之后,图片或框架加载之前,注入JS文件。
  • "document_idle"表示在"document_end"与触发window.onload事件之间的某个时间,注入JS文件,具体时间可以根据页面的内容和加载的进度优化。

示例配置

所谓content-scripts,其实就是Chrome插件中向页面注入脚本的一种形式(虽然名为script,其实还可以包括css的),借助content-scripts我们可以实现通过配置的方式轻松向指定页面注入JS和CSS(如果需要动态注入,可以参考下文),最常见的比如:广告屏蔽、页面CSS定制,等等。

{
	// 需要直接注入页面的JS
	"content_scripts": 
	[
		{
			//"matches": ["http://*/*", "https://*/*"],
			// "<all_urls>" 表示匹配所有地址
			"matches": ["<all_urls>"],
			// 多个JS按顺序注入
			"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
			// JS的注入可以随便一点,但是CSS的注意就要千万小心了,因为一不小心就可能影响全局样式
			"css": ["css/custom.css"],
			// 代码注入的时间,可选值: "document_start", "document_end", or "document_idle",最后一个表示页面空闲时,默认document_idle
			"run_at": "document_start"
		}
	],
}

injected-script

content-script有一个很大的“缺陷”,也就是无法访问页面中的JS,虽然它可以操作DOM,但是DOM却不能调用它,也就是无法在DOM中通过绑定事件的方式调用content-script中的代码(包括直接写onclickaddEventListener2种方式都不行),但是,“在页面上添加一个按钮并调用插件的扩展API”是一个很常见的需求,那该怎么办呢?

content-script中通过DOM方式向页面注入inject-script代码示例:

// 向页面注入JS
function injectCustomJs(jsPath)
{
	jsPath = jsPath || 'js/inject.js';
	var temp = document.createElement('script');
	temp.setAttribute('type', 'text/javascript');
	// 获得的地址类似:chrome-extension://ihcokhadfjfchaeagdoclpnjdiokfakg/js/inject.js
	temp.src = chrome.extension.getURL(jsPath);
	temp.onload = function()
	{
		// 放在页面不好看,执行完后移除掉
		this.parentNode.removeChild(this);
	};
	document.head.appendChild(temp);
}

你以为这样就行了?执行一下你会看到如下报错:

Denying load of chrome-extension://efbllncjkjiijkppagepehoekjojdclc/js/inject.js. Resources must be listed in the web_accessible_resources manifest key in order to be loaded by pages outside the extension.

意思就是你想要在web中直接访问插件中的资源的话必须显示声明才行,配置文件中增加如下:

{
	// 普通页面能够直接访问的插件资源列表,如果不设置是无法直接访问的
	"web_accessible_resources": ["js/inject.js"],
}

inject-script如何调用content-script中的代码,


Chrome插件的JS主要可以分为这5类:injected scriptcontent-scriptpopup jsbackground jsdevtools js

已安装的插件源码路径:

C:\Users\用户名\AppData\Local\Google\Chrome\User Data\Default\Extensions,每一个插件被放在以插件ID为名的文件夹里面,想要学习某个插件的某个功能是如何实现的,看人家的源码是最好的方法了:


open-cv 计算机视觉

1、下载安装

下载地址:https://opencv.org/releases/

然后执行: opencv-4.6.0-vc14_vc15.exe

找到我们需要的dll和jar包。x64与x86代表给不同的系统使用,由于是64位系统,所以关注x64目录


2、引入jar和dll

1、在pom.xml文件中,通过坐标的形式引入

 在项目根目录创建lib目录,将上述提及的opencv-460.jar放到该目录

<scope>system</scope>被依赖项不会从maven仓库抓,而是从本地文件系统拿

<!-- 加载lib目录下的opencv包 -->
<dependency>
    <groupId>org.opencv</groupId>
    <artifactId>opencv</artifactId>
    <version>4.6.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/opencv-460.jar</systemPath>
</dependency>

2、将 opencv_java440.dll 复制到 JAVA_HOME\jre\bin 目录或者C:\Windows\System32


3、入门案例{测试}

public class MyTest {

	// 调用OpenCV库文件
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String args[]) {
        // 创建一个3X3的对角矩阵
        Mat a = Mat.eye(3, 3, CvType.CV_8UC1);
        System.out.println(a.dump());
    }
}

public static Mat imdecode(Mat buf, int flags)
	private static Mat img2Mat(String imgPath) {
		File file = new File(imgPath);
		byte[] data = null;
		try {
			FileInputStream fin = new FileInputStream(file);
			data = new byte[(int) file.length()];
			fin.read(data);
			fin.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		Mat image = Imgcodecs.imdecode(new MatOfByte(data), Imgcodecs.IMREAD_ANYCOLOR);
		return image;
	}

感觉可以优化:

public static Mat imread(String filename)

归一化处理

归一化是一种常用的图像处理技术,它可以将图像的像素值缩放到一个特定的范围,比如 0 到 1,或者 -1 到 1。这有助于标准化图像数据,使其在后续处理中更加稳定和一致。

矩形绘制:

Imgproc.rectangle(srcImage, pt1, pt2, Scalar.GREEN, 2);

绘制文本:
 

Imgcodecs.imwrite(des + "MatchResult.jpg", templete);
  • 27
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值