2021SC@SDUSC
我负责的部分包括openmeetings-screenshare和openmeetings-util两个模块,前文已经将openmeetings-screenshare模块分析完毕,现在开始对openmeetings-util模块进行分析。本文主要对模块的结构进行梳理,开始源码的分析工作。
目录
openmeetings-util
打开openmeetings-util:其同样是一个标准的maven目录结构。pom.xml则是maven项目的核心配置文件,是maven项目必须具备的文件。src目录包含了main、site以及test目录,其中main是存放项目的java文件及资源resources,site目录中保存了项目将要生成的各html文件等等,test目录即是用来放置测试的源码,可以将测试代码和源码分离开来。
pom.xml
同样我们先来查看根目录下的pom.xml文件,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.openmeetings</groupId>
<artifactId>openmeetings-parent</artifactId>
<version>4.0.7</version>
<relativePath>..</relativePath>
</parent>
<artifactId>openmeetings-util</artifactId>
<packaging>jar</packaging>
<name>Openmeetings Util</name>
<description>Module for utility classes being used by all OpenMeetings modules</description>
<properties>
<site.basedir>${project.parent.basedir}</site.basedir>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<profiles>
<profile>
<id>Jenkins</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<inherited>true</inherited>
<configuration>
<excludedGroups>org.apache.openmeetings.test.NonJenkinsTests</excludedGroups>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>org.red5</groupId>
<artifactId>red5-server</artifactId>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>${dom4j.version}</version>
</dependency>
<dependency>
<groupId>org.mnode.ical4j</groupId>
<artifactId>ical4j</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons-codec.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-util</artifactId>
<version>${wicket.version}</version>
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-native-websocket-core</artifactId>
<version>${wicket.version}</version>
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-extensions</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
</dependency>
</dependencies>
</project>
首先声明了项目遵循哪一个POM模型版本,这里为4.0.0,定义了父项目的groupId(唯一标识符),构建标识符、版本信息以及父项目的pom.xml的相对路径“..”。然后定义了此项目的构建标识符“openmeetings-util”,以及该项目产生的构建类型(packaging打包机制)“jar”,描述:Module for utility classes being used by all OpenMeetings modules à该模块用于所有OpenMeetings模块使用的实用程序类。
<build></build>构建项目需要的信息,模块被构建成项目的一部分列出的每个模块元素是指向该模块的目录的相对路径。<plugin></plugin>元素包含描述插件所需要的信息,即描述要插入的插件,插入了org.apache.felix和org.apache.maven.plugins。<resources></resource>这个元素描述了单元测试相关的所有资源路径,这里为src/main/resources。
<profile></profile>元素在列的项目构建profile,如果被激活,会修改构建处理。这里id为Jenkins。
然后就是依赖列表<dependencies></dependencies>,项目引入插件所需要的额外依赖。这里插入了org.red5依赖,流媒体服务器。插入了org.dom4j依赖,是一个开源XML解析包,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。插入了org.mnode.ical4j依赖,是可以提供一种公共的数据格式用于存储关于日历方面的信息,比如事件、约定、待办事项等,可以推送会议提醒。
添加了commons-text、commons-lang3、commons-codec、commons-io等功能包。Apache Commons Text库包含许多有用的实用程序方法,这些方法可用于处理Strings,这是Java核心功能所没有的。apache提供的众多commons工具包,号称Java第二API,而common里面lang3包更是被我们使用得最多的。commons-codec是Apache开源组织提供的用于摘要运算、编码解码的包。常见的编码解码工具Base64、MD5、Hex、SHA1、DES等。Apache Commons IO 库包含了工具类,流的实现, 文件过滤器,文件比较器,endian转换类,还有其他更多的内容。
添加了org.apache.wicket下的wicket-util和wicket-native-websocket-core以及wicket-extensions依赖,Apache Wicket是一个功能强大的,轻量级的基于组件的Web应用程序框架,将表示和业务逻辑高度分离。还有最后一个org.apache.tika依赖,Apache Tika 是一个内容分析工具包,可以检测上千种文件类型,并提取它们的元数据和文本。tika在设计上十分精巧,单一的接口使它易于使用,在搜索引擎索引,内容分析,翻译等诸多方面得到了广泛使用。
以上是对openmeetings-util包下的pom.pom文件的整体分析,重点分析了它所添加使用的依赖。
target
out存放的是该项目下所有Module(模块)的编译结果。target存放的是单个Module的编译结果。如果为某个Module指定了编译结果的路径,则不会再输出到out文件夹中了。
你在Project Structure中的Project选项卡中可以设置Project compiler output的目录。
在Modules中选择某一个模块后,在右侧的Paths选项卡中可以设置该模块的Compiler output目录。
(上面这段话原文链接:
intellj idea中target目录和out目录有什么区别_ChasingdreamLY的博客-CSDN博客_idea中target)
IDEA项目中target目录的作用target是idea默认的编译路径,用来存放项目的:文件和目录 、jar包、war包、class文件等。
src
再来看src目录下的文件:
src目录下有三个主要文件夹,前文提到过,包括main、site和test文件夹,其中main是存放项目的java文件及资源resources,site目录中保存了项目将要生成的各html文件等等,test目录即是用来放置测试的源码,可以将测试代码和源码分离开来。后续将会逐个分析每个文件里面包含什么内容。
site
首先看site文件,其中只有一个文件内容即site.xml,打开它:
每个item都有name属性和href属性,name属性和href属性一起决定一个html网页。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/DECORATION/1.7.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/DECORATION/1.7.0 http://maven.apache.org/xsd/decoration-1.7.0.xsd"
name="Apache OpenMeetings Project">
<body>
<menu ref="parent"/>
<menu name="Project">
<item name="About" href="/index.html" />
<item name="Info" href="/project-info.html" />
<item name="Summary" href="/summary.html" />
<item name="License" href="http://www.apache.org/licenses/" />
<item name="Dependencies" href="/dependencies.html" />
<item name="Dependency Convergence" href="/dependency-convergence.html" />
<item name="RAT Report" href="/rat-report.html" />
<item name="JavaDoc" href="/apidocs/index.html" target="_blank" />
</menu>
</body>
<custom>
<reflowSkin>
<bottomNav maxSpan="12">
<column>Parent Project</column>
<column>Project</column>
</bottomNav>
</reflowSkin>
</custom>
</project>
test
再来看test里面的内容:
首先看test包下的NonJenkinsTests里面有一个自定义注解类NonJenkinsTests,在Java中,定义注解其实和定义接口差多不,只需要在interface前添加一个@符号就可以。注解中的方法即为注解的元素,元素中不能包含参数,返回值只能为简单数据类型、String、Class、emnus、注释 和这些类型的数组。使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。
再看util包下,有几个可运行test类TestCalendarPatterns、TestStoredFile、TestVersion以及crypt包,crypt包下有一个抽象可运行类AbstractCryptTest和TestSCrypt类。
其中这些测试类都是对openmeetings-util里写的代码进行测试查看是否能正常运行,等分析完main文件夹下的代码再具体看这里的测试类代码。
main
main文件夹下总共有25个类和接口,之后的文章将对其进行逐个分析,util是工具包,例如可以实现日历日期功能、版本功能、连接功能等。
总结
对openmeetings-util开了个头,主要是对根目录下的pom.xml展开分析,对模块结构进行梳理,整体描述,对site、main和test有个整体的了解,也对site下的site.xml进行了分析,之后将对此文件下的主要代码包main下的文件和类进行仔细分析。