导航:首页 > 源码编译 > 如何编译mojo

如何编译mojo

发布时间:2022-08-04 18:22:24

‘壹’ 如何在电脑上使用MOJO 解码耳放(详细步骤)

去官网下载驱动然后直接插上去就行

‘贰’ 如何编写maven plugin 基础

当maven内置的功能不能满足需求的时候怎么办,那就只能给它写插件了。 (话说回来,给maven扩展只能写一个很完整的插件,而不能是一个简单的script,真的是太笨重了)网络上很多maven的文章,但基本很少谈及如何给它写插件,即使你搜索maven plugin,也只是给你返回一堆如何使用maven插件的文章。希望这边文章能给一些maven使用者带来帮助。我在这里先假设你已经懂得使用maven,我不会贴出完整的pom.xml文件首先,你需要创建一个maven项目,插件是一种特殊的maven项目 然后修改pom.xml,将packaging改为maven-plugin<packaging>maven-plugin</packaging>通过properties定义maven的版本<properties><maven.version>2.2.1</maven.version></properties>maven3已经出了很久,并且兼容maven2,因此我们团队内部都是统一使用maven3,但是我这里编写插件使用的是maven2,可以同时在maven2和maven3下使用,不过其实这个原因并不重要,真正的原因是因为maven3的代码实在太烂了,最初的时候我用maven3的api lib来写,发现里面很多代码根本没有注释,而且很多代码已经废弃,但是并没有明确说明究竟用什么方法代替。接着添加依赖<dependencies><dependency><groupid>org.apache.maven</groupid><artifactid>maven-plugin-api</artifactid><version>${maven.version}</version></dependency><dependency><groupid>org.apache.maven</groupid><artifactid>maven-core</artifactid><version>${maven.version}</version></dependency></dependencies>然后开始创建Mojo类,maven插件里面每一个具体的功能都是一个Mojo 比如说eclipse:clean和eclipse:eclipse就是两个Mojo/*** @goal helloWorld*/{publicvoidexecute()throwsMojoExecutionException{getLog().info("Hello, world!");}}首先继承AbstractMojo,并且实现execute()方法,这个就是每次调用进入的地方 然后需要在类的javadoc上定义,这是一个annotation出来之前常用的定义方法(或许未来maven会将它改成annotation,那就能提供编译校验和IDE校验)。我们必须定义@goal,代表运行目标,简单来说就是eclipse:clean中的clean Mojo写在哪个package底下都是可以的这样,我们就完成了一个简单的maven plugin,然后我们需要一个简单的测试来确定他正确运行 先通过maven install将它安装到本地仓库然后打开任意maven的项目(比如说我们原来已经在用maven的项目),在pom.xml增加一个plugin<build><plugins><plugin><groupid>xxx</groupid><artifactid>xxx</artifactid><version>xxx</version><executions><execution><phase>compile</phase><goals><goal>helloWorld</goal></goals></execution></executions></plugin></plugins></build>需要留意的是phase部分,我们将这个plugin绑定到compile这个周期 然后我们运行mvn compile,就能成功看见Hello, world!输出 (当然你也可以直接通过命令行运行,需要带上完整的groupId和artifactId才能调用)

‘叁’ 是goal还是phase

是 goal 还是 phase?Maven 插件(plugin)goal 的执行与生命周期 (lifecycle)phase 的关系 这其实并不是一个复杂的问题,但是似乎没有什么资料对此做过清晰的说明,本文将对这个 问题做一个详细的解释。 背景知识 maven 对构建(build)的过程进行了抽象和定义,这个过程被称为构建的生命周期(lifecycle)。 生命周期(lifecycle)由多个阶段(phase)组成,每个阶段(phase)会挂接一到多个goal。goal 是 maven 里定义任务的最小单元,相当于ant 里的target。 以phase 为目标构建 以phase 为目标进行构建是最常见的,如我们平时经常执行的mvn compile,mvn test,mvn package...等等,compile,test,package 都是maven 生命周期(lifecycle)里的phase,通过mvn 命令,你可以指定一次构建执行到那一个阶段,在执行过程中,所有经历的执行阶段(phase) 上绑定的goal 都将得到执行。例如,对于一个jar 包应用,当执行mvn package 命令时, maven 从validate 阶段一个阶段一个阶段的执行,在执行到 compile 阶段时,compiler 插 件的compile goal 会被执行,因为这个goal 是绑定在compile 阶段(phase)上的。这一点可 从其对应的mojo 类上得知: 再比如经常使用的打包插件shade,它的goal 是绑定到package 阶段的,这样,使用mvn package 进行打包时都会执行shade 的。 以goal 为目标构建 虽然以phase 为目标的构建最常见,但是有时候我们会发现,一些插件的goal 并不适合绑 定到任何阶段(phase)上,或者是,这些goal 往往是单独执行,不需要同某个阶段(phase) 绑定在一起,比如hibernate 插件的导入\导出goal 多数情况下是根据需要要手动执行的(当 然,也可以绑定到某个阶段上,比如进行单元测试时,可考虑将其绑定到 test 阶段上)。再 比如jetty(6.1.26)插件,它的goal 都是将打包或未打包的工程部署到jetty 里然后启动jetty 容器的,多数情况下,人们都是独立运行这些goal 的,比如:人们希望当键入mvn jetty:run 后,工程就能完成编译后启动jetty,而jetty 插件也确实是这样做的,它的run goal 的mojo 是这样声明的: 其中@execute phase="test-compile"指明 jetty:run 这一 goal 会促使 maven 先 build 到 test-compile 阶段,再执行这个 goal.同样,对于 jetty:run-war 这个goal 则要求先build 到 package 阶段再执行该goal. 而另外一个例子是exec 插件的exec:java. 这个goal 也声明了execute 的phase,但却是validate,这样,如果代码没有编译,执行这 个goal 就会出错,所以多数情况下,人们总是使用下面的方式执行的: mvn clean compile exec:java

‘肆’ maven小例子,要编译成jar包。但是install不通过。求教!

编译jar包没必要install,只要package就可以了

‘伍’ maven编译项目报错了

看看maven的本地仓库相应的编译插件有没有问题。
我的本地仓库中的依赖包都是用的阿里云的镜像仓库下载的。

‘陆’ eclipse中更新maven update project 如果直接用maven命令的话,是哪个命令i

你好:这个的话,命令也不太好用啊,你可以参考下,这些事maven的所有命令

Maven库:
http://repo2.maven.org/maven2/
Maven依赖查询:
http://mvnrepository.com/
Maven常用命令:
1.创建Maven的普通java项目:
mvnarchetype:create
-DgroupId=packageName
-DartifactId=projectName
2.创建Maven的Web项目:
mvnarchetype:create
-DgroupId=packageName
-DartifactId=webappName
-DarchetypeArtifactId=maven-archetype-webapp
3.编译源代码:mvncompile
4.编译测试代码:mvntest-compile
5.运行测试:mvntest
6.产生site:mvnsite
7.打包:mvnpackage
8.在本地Repository中安装jar:mvninstall
9.清除产生的项目:mvnclean
10.生成eclipse项目:mvneclipse:eclipse
11.生成idea项目:mvnidea:idea
12.组合使用goal命令,如只打包不测试:mvn-Dtestpackage
13.编译测试的内容:mvntest-compile
14.只打jar包:mvnjar:jar
15.只测试而不编译,也不测试编译:mvntest-skippingcompile-skippingtest-compile
(-skipping的灵活运用,当然也可以用于其他组合命令)
16.清除eclipse的一些系统设置:mvneclipse:clean

ps:

一般使用情况是这样,首先通过cvs或svn下载代码到本机,然后执行mvneclipse:eclipse生成ecllipse项目文件,然后导入到eclipse就行了;修改代码后执行mvncompile或mvntest检验,也可以下载eclipse的maven插件。

mvn-version/-v显示版本信息
mvnarchetype:generate创建mvn项目
mvnarchetype:create-DgroupId=com.oreilly-DartifactId=my-app创建mvn项目

mvnpackage生成target目录,编译、测试代码,生成测试报告,生成jar/war文件
mvnjetty:run运行项目于jetty上,
mvncompile编译
mvntest编译并测试
mvnclean清空生成的文件
mvnsite生成项目相关信息的网站
mvn-Dwtpversion=1.0eclipse:eclipse生成Wtp插件的Web项目
mvn-Dwtpversion=1.0eclipse:clean清除Eclipse项目的配置信息(Web项目)
mvneclipse:eclipse将项目转化为Eclipse项目

在应用程序用使用多个存储库
<repositories>
<repository>
<id>Ibiblio</id>
<name>Ibiblio</name>
<url>http://www.ibiblio.org/maven/</url>
</repository>
<repository>
<id>PlanetMirror</id>
<name>PlanetMirror</name>
<url>http://public.planetmirror.com/pub/maven/</url>
</repository>
</repositories>


mvndeploy:deploy-file-DgroupId=com-DartifactId=client-Dversion=0.1.0-Dpackaging=jar-Dfile=d:client-0.1.0.jar-DrepositoryId=maven-repository-inner-Durl=ftp://xxxxxxx/opt/maven/repository/


发布第三方Jar到本地库中:

mvninstall:install-file-DgroupId=com-DartifactId=client-Dversion=0.1.0-Dpackaging=jar-Dfile=d:client-0.1.0.jar


-DdownloadSources=true

-DdownloadJavadocs=true

mvn-e显示详细错误信息.

mvnvalidate验证工程是否正确,所有需要的资源是否可用。
mvntest-compile编译项目测试代码。。
mvnintegration-test在集成测试可以运行的环境中处理和发布包。
mvnverify运行任何检查,验证包是否有效且达到质量标准。
mvngenerate-sources产生应用需要的任何额外的源代码,如xdoclet。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lifxue/archive/2009/10/14/4662902.aspx

常用命令:
mvn-v显示版本
mvnhelp:describe-Dplugin=help使用help插件的describe目标来输出MavenHelp插件的信息。
mvnhelp:describe-Dplugin=help-Dfull使用Help插件输出完整的带有参数的目标列
mvnhelp:describe-Dplugin=compiler-Dmojo=compile-Dfull获取单个目标的信息,设置mojo参数和plugin参数。此命令列出了Compiler插件的compile目标的所有信息
mvnhelp:describe-Dplugin=exec-Dfull列出所有MavenExec插件可用的目标
mvnhelp:effective-pom看这个“有效的(effective)”POM,它暴露了Maven的默认设置

mvnarchetype:create-DgroupId=org.sonatype.mavenbook.ch03-DartifactId=simple-DpackageName=org.sonatype.mavenbook创建Maven的普通java项目,在命令行使用MavenArchetype插件
mvnexec:java-Dexec.mainClass=org.sonatype.mavenbook.weather.MainExec插件让我们能够在不往classpath载入适当的依赖的情况下,运行这个程序
mvndependency:resolve打印出已解决依赖的列表
mvndependency:tree打印整个依赖树

mvninstall-X想要查看完整的依赖踪迹,包含那些因为冲突或者其它原因而被拒绝引入的构件,打开Maven的调试标记运行
mvninstall-Dmaven.test.skip=true给任何目标添加maven.test.skip属性就能跳过测试
mvninstallassembly:assembly构建装配MavenAssembly插件是一个用来创建你应用程序特有分发包的插件

mvnjetty:run调用Jetty插件的Run目标在JettyServlet容器中启动web应用
mvncompile编译你的项目
mvncleaninstall删除再编译

mvnhibernate3:hbm2ddl使用Hibernate3插件构造数据库

‘柒’ 怎么根据pom文件设置tomcat

1. 发布步骤
1.1 修改tomcat的tomcat-users.xml配置文件

在{tomcat_home}/conf/tomcat-user.xml中加入如下代码:
<user username="admin"password="admin" roles="admin,manager"/>
说明:该代码主要是设置 tomcat 控制页面的用户名和密码。

1.2 修改pom.xml文件

修改pom.xml文件,加入tomcat插件代码,如下:
< plugin >
< groupId > org.codehaus.mojo </ groupId >
< artifactId > tomcat - maven - plugin </ artifactId >
< version > 1.1 </ version >
< configuration >
< url > http://192.168.1.207:8989/manager/html </ url >
< server > tomcat6 </ server >
</ configuration >
</ plugin >

1.3 修改maven的setting.xml文件

打开我的工作目录,修改{my_home}/.m2/setting.xml文件,如果没有改文件,可以将{m2_home}/conf/setting.xml复制到{my_home}/.m2目录之下,然后修改setting.xml文件。
在<servers></servers>中加入如下代码:
<server>
<id>tomcat6</id>
<username>admin</username>
<password>admin</password>
</server>

说明:改代码主要是设置tomcat服务的id以及tomcat管理台的用户名和密码,应为发布项目的时候需要tomcat的用户名和密码,此处的id要和pom.xml中tomcat插件代码中的<server></server>节点的值一致。
1.4 启动tomcat

运行{tomcat_home}/bin/startup.bat文件,启动tomcat。
1.5 通过maven将项目发布到tomcat中

在项目pom.xml所在目录中,依次执行以下命令:
mvn clean;
mvn compile
mvn package
mvn tomcat:deploy

以上命令执行完毕以后我们的项目就发布到tomcat中了。
以上命令说明:
mvn clean;--清理项目
mvn compile;--编译项目
mvn package;--打包项目
mvn tomcat:deploy;--根据pom.xml的配置将项目发布到tomcat中
mvn tomcat:undeploy;--卸载tomcat中的项目

‘捌’ 如何编写一个Maven插件

基础

当maven内置的功能不能满足需求的时候怎么办,那就只能给它写插件了。 (话说回来,给maven扩展只能写一个很完整的插件,而不能是一个简单的script,真的是太笨重了)

网络上很多maven的文章,但基本很少谈及如何给它写插件,即使你搜索maven plugin,也只是给你返回一堆如何使用maven插件的文章。希望这边文章能给一些maven使用者带来帮助。

我在这里先假设你已经懂得使用maven,我不会贴出完整的pom.xml文件

首先,你需要创建一个maven项目,插件是一种特殊的maven项目 然后修改pom.xml,将packaging改为maven-plugin

<packaging>maven-plugin</packaging>

通过properties定义maven的版本

<properties>
<maven.version>2.2.1</maven.version>
</properties>

maven3已经出了很久,并且兼容maven2,因此我们团队内部都是统一使用maven3,但是我这里编写插件使用的是maven2,可以同时在maven2和maven3下使用,不过其实这个原因并不重要,真正的原因是因为maven3的代码实在太烂了,最初的时候我用maven3的api lib来写,发现里面很多代码根本没有注释,而且很多代码已经废弃,但是并没有明确说明究竟用什么方法代替。最后我使用了maven2中被maven3废弃的api来完成我的功能,跑的挺好的,就是有时可能会有一些使用准备废弃的api的提醒而已。


接着添加依赖

<dependencies>
<dependency>
<groupid>org.apache.maven</groupid>
<artifactid>maven-plugin-api</artifactid>
<version>${maven.version}</version>
</dependency>
<dependency>
<groupid>org.apache.maven</groupid>
<artifactid>maven-core</artifactid>
<version>${maven.version}</version>
</dependency>
</dependencies>

然后开始创建Mojo类,maven插件里面每一个具体的功能都是一个Mojo 比如说eclipse:clean和eclipse:eclipse就是两个Mojo

/**
*@goalhelloWorld
*/
{
publicvoidexecute()throwsMojoExecutionException
{
getLog().info("Hello,world!");
}
}

首先继承AbstractMojo,并且实现execute()方法,这个就是每次调用进入的地方 然后需要在类的Javadoc上定义,这是一个annotation出来之前常用的定义方法(或许未来maven会将它改成annotation,那就能提供编译校验和IDE校验)。我们必须定义@goal,代表运行目标,简单来说就是eclipse:clean中的clean Mojo写在哪个package底下都是可以的

这样,我们就完成了一个简单的maven plugin,然后我们需要一个简单的测试来确定他正确运行 先通过maven install将它安装到本地仓库

然后打开任意maven的项目(比如说我们原来已经在用maven的项目),在pom.xml增加一个plugin

<build>
<plugins>
<plugin>
<groupid>xxx</groupid>
<artifactid>xxx</artifactid>
<version>xxx</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>helloWorld</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

需要留意的是phase部分,我们将这个plugin绑定到compile这个周期 然后我们运行mvn compile,就能成功看见Hello, world!输出 (当然你也可以直接通过命令行运行,需要带上完整的groupId和artifactId才能调用)


注入

Mojo是一个很简单的Java Bean模式的类,你会发现Mojo所继承的AbstractMojo里面之后非常少的方法。那我们需要在Mojo.execute里面获取当前运行中的上下文如何处理呢?答案是注入,就是跟spring ioc差不多的注入方式。

常用的注入主要有两种,第一种是xml配置中的额外设置 比如说我们有这么一个plugin的配置

<plugin>
<artifactid>maven-eclipse-plugin</artifactid>
<configuration>
<downloadsources>true</downloadsources>
</configuration>
</plugin>

所有写在configuration里面的属性都可以注入到Mojo中,比如说以下代码

/**
*@parameter
*/
privatebooleandownloadSources;

就可以通过downloadSources变量获得配置中的值 值得注意的是,这里是不用生成完整的JavaBean模式的get/set的,并且private是有效的

javadoc里面还可以加入其他属性,比如说

/**
*@parameterdefault-value="true"
*@readonly
*/
privatebooleandownloadSources;

就是默认为true,并且不能通过配置修改(当然我们这里肯定不会有这样的需求) 更多的javadoc可以参看官方文档中的说明

第二种注入的数据就是上下文,跟HttpServlet.getServletContext这种写法不一样,如果我们需要Mojo运行期的上下文,也是通过注入获得的

/**
*@parameterexpression="${project}"
*@readonly
*/
privateMavenProjectproject;
/**
*@component
*@readonly
*/
;

例如这里我们就能获得ArtifactFactory和MavenProject 需要注意的是这里可能有两种方法,第一种跟xml配置获得的方法差不多,通过expression指定名字 实际上,你在xml里面,也可以通过${project}获得相应的东西进行一些简单的操作(当然xml里面只能文本描述,这里是一个类)

另外一种就是使用@component这个标注,可以获得一些基本的组件实例。


测试

写完一个插件之后,我们就需要对他进行测试 如果我们用人工测试的话,将会非常麻烦,因为maven插件本身的发布流程就非常复杂 你需要编译打包你的maven插件,然后安装到本地库(或远程私库中),然后写一个sample project,再运行,看一下是否正确 当然你也可以用单元测试来解决一些问题,但是单元测试比较难保证插件最终正确,而且maven插件很经常是跟文件打交道

这里我们就需要对maven插件进行自动化的集成测试 maven的生命周期是包含集成测试的,默认是没有绑定任何功能。不过如果你google一下,会找到一些maven进行集成测试的例子,大致就是启动jetty,然后通过http访问验证,再关闭jetty

我们这里使用的是maven-invoker-plugin,它就是用于maven插件的集成测试

先在pom.xml中加入

<build>
<plugins>
<plugin>
<artifactid>maven-invoker-plugin</artifactid>
<configuration>
<cloneprojectsto>${project.build.directory}/it</cloneprojectsto>
</configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>install</goal>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

cloneProjectsTo是先将测试案例拷贝出来再运行 execution段的设定是把maven-invoker-plugin的两个goal绑定到integration-test上 integration-test这个生命周期会在mvn install之前调用

集成测试的内容放在 src/it 目录下,每新建一个目录代表一个独立的测试,里面放一个完整的maven项目,当然你在这个项目里面需要引入自己编写的maven插件并且运行 另外还需要一个postbuild.groovy文件,放在测试案例的根目录,这个脚本的用处是检查运行后的maven项目是否达到自己要的效果。很明显,看名字就知道用groovy来写,一般我们会检查一下,是否产生了某某文件等等来判定,如果不正确的话抛出异常

然后我们在maven插件目录运行mvn integration-test就能进行集成测试了

‘玖’ maven compiler plugin3.1compile是什么意思

maven-compile-plugin

这个插件就如同名字所显示的这样,用来编译源代码的。


最开始碰到这个插件是在于有的时候我们下载了一些工程需要编译的时候,比如我们输入命令:mvn install


但是系统编译的时候报错了,错误的信息如下:


[ERROR]Failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile(default-compile)onprojectspringJMS:Compilationfailure:Compilationfailure:
[ERROR]/home/frank/programcode/SpringJMSSample/src/main/java/huangbowen/net/jms/MessageSender.java:[6,1]error:annotationsarenotsupportedin-source1.3
[ERROR]
[ERROR](use-)
[ERROR]/home/frank/programcode/SpringJMSSample/src/main/java/net/EmbedBrokerApp.java:[5,7]error:-source1.3
[ERROR]->[Help1]
[ERROR]
[ERROR],re-runMavenwiththe-eswitch.
[ERROR]Re-runMavenusingthe-.
[ERROR]
[ERROR],:
[ERROR][Help1]http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

从错误显示的信息我们就可以看出,这是因为编译的时候是默认用的javac 1.3版本的,太老了不支持代码里的特性。


为了修改这个问题,我们需要设置编译器的版本。

解决这个问题的办法也比较简单,就是直接在后面的插件部分增加如下的插件,


比如如下部分,将编译器的版本设定为1.7:


<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>

‘拾’ 使用maven编译JAVA程序是出错

问题描述:
在eclipse中build一个普通maven项目,报错,提示信息是缺少maven插件(插件名称忘了)。

原因:
可能是由于使用了eclipse自带的jre导致的,这个jre里没有tools.jar,而jdk的lib目录下有(个人理解)。

解决办法:
1、检查eclipse的配置,确保使用的不是eclipse自带的版本。
步骤:在eclipse中打开Window->Preferences->Java->Installed JREs->Add,添加自己下载并配置好的jdk(别忘了配置环境变量),我用的是jdk1.6.0_4.3。


2、然后再次编译maven项目,仍然报错,但提示信息改变了,提示的是C:\Users\Administrator.EED4VRFALFPIIBP\.m2\repository\commons-logging\commons-logging下的jar包解析失败;
3、解决方案:删除repository文件夹,确保网络畅通,重启eclipse,执行Maven->Project
Update,问题解决。

注意:如果你的eclipse中配置了tomcat,那么你也需要重新选择tomcat的jdk版本,确保与前面的一致。

步骤:在eclipse中打开Window->Preferences->Server->Runtime
Environment->选中你的tomcat server->Edit,在JRE这项里选择你的jdk,完成。

阅读全文

与如何编译mojo相关的资料

热点内容
u盘备份linux 浏览:120
高压缩比活塞 浏览:92
压缩弹簧标准件 浏览:25
linux统计个数命令 浏览:292
cad转pdf居中 浏览:8
编译型语言处理过程 浏览:325
手机创文件夹复制到电脑 浏览:984
有什么直播APP可以看那种 浏览:41
程序员叫什么人 浏览:378
python画地图等高线 浏览:751
epic永劫无间是什么服务器 浏览:444
网游服务器下载地址 浏览:107
macphpfreetype安装 浏览:644
设计道pdf 浏览:615
单片机kill4软件下载收费吗 浏览:846
苹果手机怎么连接RMS服务器 浏览:603
cisco路由器基本配置命令 浏览:187
android状态栏颜色透明 浏览:117
db2编译工具 浏览:181
腾讯云服务器创建环境 浏览:567