Java

Java 11 ( 1 ) 模块化

Submitted by Lizhe on Wed, 09/26/2018 - 15:55

Java9 和 Java10 都不是长期支持版本, 而且Java9的改动非常大, Oracle于昨天 2018年9月25日更新了JavaSE 11

所以想拿出来研究一下, 这里特别强调是JavaSE 11 是因为EE已经跟这个没关系了

因为之前java9就没仔细看, 现在放在一起记录一下

 

环境准备:

这里我建议还是用虚拟机, 因为当前的真实开发环境中很多都是java8的, 不要直接升级成11

这里我在Mac上所以直接用了vagrant, 安装过程也很简单, oracle官网下载完rpm包之后直接yum安装就可以了

 

首先来个helloworld

代码结构如下

Maven的父子项目循环依赖问题

Submitted by Lizhe on Fri, 03/23/2018 - 23:37

        方法一:欺骗的办法,先去掉父pom.xml中的modules,然后install或者deploy父pom.xml,然后再install或者deploy所有依赖的子工程,最后再把父pom.xml中的modules都加上。

        方法二:使用参数-N,命令如:mvn install:install-file -DgroupId=test   -DartifactId=test-parent   -Dpackaging=pom  -Dfile=d:\wokspace\pom.xml -Dversion=3.0.4.7-SNAPSHOT -N,注意后边这个标红的-N就是我们要加的参数,这个参数的意思是:放弃递归子工程。

springboot maven 多模块引用不到依赖的类

Submitted by Lizhe on Fri, 03/23/2018 - 10:52

记录一个碰到的古怪问题

现象是, 我在使用springboot作为框架时, 使用了多个maven的子模块, 当开启eclipse的auto build时没有问题

怀疑是eclipse自己对项目进行了build,然后把class放在了正确的位置

当关闭了eclipse的build转为仅仅使用maven install命令时会提示找不到对应的自定义类

就是说A模块先install之后, B模块将A放入自己依赖描述, 然后引用A模块定义的class, 编译失败提示找不到

root cause 在于我使用了

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>

从springboot1.4 开始, springboot plugin打包的jar会将classes文件放入

一个名为BOOT-INF的文件夹而不是jar包的根路径 例如 C:\ttt\lira-user-0.0.1-SNAPSHOT\BOOT-INF\classes

Lucene (6) Query子类

Submitted by Lizhe on Thu, 12/28/2017 - 15:56

1. TermQuery

对索引中特定项进行搜索, Term是最小的索引片段, 每个Term包含了一个域名和一个文本值.

Term t = new Term("title", "java");

Query q = new TermQuery(t);

使用这个TermQuery对象进行搜索, 可以返回在title域包含单词java的所有文档

注意域值是区分大小写的

2. TermRangeQuery

索引中的各个Term对象会按照字典编排顺序(通过String.compareTo方法)

搜索时包含或不包含起始项和终止项, 如果这个项为空, 那么它对应的端就是无边界的

Query q = new TermRangeQuery("title", new BytesRef("a"), new BytesRef("z"), true, true);

末尾的两个布尔型参数表示 

Lucene (4) 搜索

Submitted by Lizhe on Tue, 12/26/2017 - 11:22

当你查询Lucene索引时, 它将会返回一个包含有序的ScoreDoc对象数组的TopDocs对象.

在输入查询后, Lucene会为每个文档计算评分(用以表示相关性的数值)

IndexSearcher 所有搜索都通过IndexSearcher进行, 它们会调用该类中重载的search方法
Query 封装某种查询类型的具体子类. Query实例将被传递给IndexSearcher的search方法
QueryParser 将用户输入的查询表达式处理成具体的Query对象
TopDocs 保持由IndexSearcher.search()方法返回的具有较高评分的顶部文档
ScoreDoc 提供对TopDocs中没跳搜索结果的访问接口

 

Lucene (3) 并发,线程安全和锁

Submitted by Lizhe on Fri, 12/22/2017 - 15:10

 

任意数量的只读属性的IndexReader类都可以同时打开同一个索引.

无论这些Reader是否属于同一个JVM, 以及是否属于同一台计算机都无关紧要.

但需要记住, 在单个JVM内, 利用资源和发挥效率的最好办法是用线程共享单个的IndexReader实例

 

对于一个索引来说, 一次只能打开一个Writer. Lucene采用文件锁来提供保障. 一旦建立起IndexWriter对象, 系统会立刻分配一个锁给它.

该锁只有当IndexWriter对象被关闭时才会释放.

注意如果你使用IndexReader对象来改变索引的话, 比如修改norms或者删除文档, 这时IndexReader对象会作为Writer使用, 它必须在修改上述内容之前成功地获取Write锁, 并在被关闭时释放该锁  

 

当IndexWriter对象已经打开一个索引时, 你可以同时直接使用IndexReader打开同一个索引.

每个IndexReader对象会得到一个对应时间点的索引"快照", IndexReader只有在IndexWriter提交修改 或者 IndexReader自己被重新打开后才能获知索引的修改情况

Lucene (2) 构建索引

Submitted by Lizhe on Wed, 12/20/2017 - 17:19

如果想要搜索存储在硬盘上的文件,电子邮件,网页或是数据库中的数据, Lucene都可以做到

在开始搜索之前, 你必须对搜索内容进行索引.

一个文档Document对象包含若干个域Field, 每个Field都有一个标示名称, 该名称为一个文本值或者二进制值

Lucene可以对域进行3种操作

1 域值可以被索引

2 域被索引后, 还可以选择性的存储项向量

3 域值可以被单独存储

addDocument(Document) 使用默认分析器添加文档, 该分析器在创建IndexWriter对象时指定

 

删除索引中的文档

Lucene (1)

Submitted by Lizhe on Wed, 12/20/2017 - 15:50

在Lucene中, 要经过如下步骤才能获得检索结果

1. 创建分析器

StandardAnalyzer analyzer = new StandardAnalyzer();

2. 将原始内容转换成"文档"

Directory index = new RAMDirectory();

3. 向索引添加文档

IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter w = new IndexWriter(index, config);
addDoc(w, "Lucene in Action", "193398817");
addDoc(w, "Lucene for Dummies", "55320055Z");
addDoc(w, "Managing Gigabytes", "55063554A");
addDoc(w, "The Art of Computer Science", "9900333X");
w.close();

4. 调用查询

security-constraint auth-constraint

Submitted by Lizhe on Mon, 12/18/2017 - 17:42

<security-constraint> 的子元素 <http-method> 是可选的,如果没有 <http-method> 元素,这表示将禁止所有 HTTP 方法访问相应的资源。 
子元素 <auth-constraint> 需要和 <login-config> 相配合使用,但可以被单独使用。如果没有 <auth-constraint> 子元素,这表明任何身份的用户都可以访问相应的资源。也就是说,如果 <security-constraint> 中没有 <auth-constraint> 子元素的话,配置实际上是不起中用的。如果加入了 <auth-constraint> 子元素,但是其内容为空,这表示所有身份的用户都被禁止访问相应的资源。 

所以下面的意思是, 任何人不得访问所有路径下的OPTIONS/TRACE 方法