-
maven工程编译并生成可执行JAR包命令
2013-08-29 22:51:00在JAVA持续集成构建中,需要从SVN check out的代码编译并打成可执行JAR...利用HUDSON+MAVEN编译打包java maven工程,打包成可执行的JAR包。在HUDSON中需要填写maven命令。我想知道的是打可执行jar包的maven命令。 我的在JAVA持续集成构建中,需要从SVN check out的代码编译并打成可执行JAR包,高手告诉我maven命令如何? 我用mvn compile package或mvn jar:jar都能打成jar包,但不能执行
利用HUDSON+MAVEN编译打包java maven工程,打包成可执行的JAR包。在HUDSON中需要填写maven命令。我想知道的是打可执行jar包的maven命令。 我的pom.xml中添加了: <plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive> <manifest>mainClass>com.ImageViewer.dao.ImageViewer</mainClass></manifest> </archive></configuration></plugin> 目前的mvn命令是:clean assembly:assembly 但是build时报错:mavenExecutionResult exceptions not empty org.apache.maven.InternalErrorException: Internal error: ava.lang.NullPointerException 换成jar:jar打成的jar包不能执行。
-
java命令打包java工程
2018-08-08 17:44:26自动打包java工程 介绍 自动打包java工程,主要功能是什么呢?没错,如标题所言,就是通过...特殊情况需要,如果需要在服务器中,实现自动生成jar包,而不是在IDE的情况下,就需要该工具实现导出jar包。当然,本...自动打包java工程
介绍
自动打包java工程,主要功能是什么呢?没错,如标题所言,就是通过命令实现自动打包普通java工程,将java工程打包成一个jar包。
前言
肯定很多人会疑惑,为什么不用IDE直接导出jar呢?还要编写命令?不是多此一举?
答案是:
特殊情况需要,如果需要在服务器中,实现自动生成jar包,而不是在IDE的情况下,就需要该工具实现导出jar包。当然,本地也是可以使用的。
如果,刚好你也有这种需求,需要通过java命令导出jar包的话,可以看下这篇博客。因为,我就是刚好碰到。
因为,我找不到完整的命令,所以,想把这次的调研和开发脚本过程记录下来~
当然,该工具还需要更加完善,如有建议,欢迎留言~思路
- 通过javac命令,实现将java格式的文件编译成class文件
- 将所有的class文件和配置文件,通过jar命令压缩成功一个jar文件
需要解决的问题
- 如果使用命令javac编译所有java文件?
- 使用javac编译java文件的过程中,如何让编译的java文件能正确地找到对应依赖的lib和其他包名下的java文件?
- 如何在压缩class成jar的时候,将其他jar包也压缩到目标jar中呢?
方案如下
–>如何编译所有java文件?
两种情况
一、如果要导出的jar包是有执行主类的,先是查找项目配置文件 MANIFEST.MF 读取出执行的Main类,然后编译Main类,因为Main类在编译的过程中,会通过需要用到的类去寻找编译,这样的话,就可以链式的编译整个项目有需要用到的java文件。
二、导出来的jar包不可以直接执行的,只能作为lib使用的,也就是没有配置文件,那就是通过找出所有包名,然后编译所有包名下的java文件,当然,javac可以一次性编译一个文件夹下的所有java文件。–>使用javac编译java文件的过程中,如何让编译的java文件能正确地找到对应依赖的lib和其他包名下的java文件?
javac命令中,有一个可选项,-cp(-classpath) 后面带的就是编译时需要用到的依赖jar 和对应的其他依赖库,还有所有包名,但是为了编译的时候能找到对应的包名,必须cd到对应的src目录
例如:javac -classpath .;../libs/dom4j-2.1.0.jar;compiler;main;utils;vo -encoding utf-8 -d ../classesOutput -Xlint:unchecked -Xlint:deprecation builder/*.java
–>如何在压缩class成jar的时候,将其他jar包也压缩到目标jar中呢?
将用到的jar包复制到编译出的class文件夹中,然后使用jar命令压缩即可
javac命令
javac -classpath .;../libs/dom4j-2.1.0.jar;compiler;main;utils;vo -encoding utf-8 -d ../classesOutput -Xlint:unchecked -Xlint:deprecation builder/*.java 说明: -classpath 后面带的是编译过程中所需要用到的类,可以为jar包、类保存的文件夹、zip文件等 -encoding 指定编译时的java文件编码格式为utf-8格式 -d 后面带输出的class的路径 -Xlint:unchecked -Xlint:deprecation 避免编译不通过 builder/*.java 编译当前目录下的builder包中的所有Java文件
注意:
1、Windows下和Linux下的命令还有所差异,Windows下,-cp(-classpath)后面接的库需要用’;‘隔开,Linux下的得用’:'隔开
2、在Linux下,使用Java.Runtime.exec命令执行的时候,需要注意,部分命令执行无法达到效果,也就是没执行起来,具体的调用,在Linux下,需要加上两个操作符。
String[] cmds = {“sh”, “-c”, cmd};
process = Runtime.getRuntime().exec(cmds, null, runDir);
3、文件的编码格式最好是utf-8,不然编译会出问题
4、jar包和输出路径可以使用绝对路径,但是包名的应用不能使用绝对路径,不然会找不到对应的包名
5、执行该命令的时候,一定要cd到src目录中,不然包名会找不到!
6、最好添加这两个可选项 -Xlint:unchecked -Xlint:deprecation 不然,当接口废弃或者unchecked的时候,会提示哪些方法是unchecked和deprecation的!jar命令
jar cvfm C:/Users/37/Desktop/test/test.jar C:/Users/37/Desktop/test/bin/META-INF/MANIFEST.MF -C C:/Users/37/Desktop/test/bin/ . 说明: jar cvfm 输出的jar包的路径 配置文件的路径 -C 编译的好的class文件夹路径 . 注意:bin/ 表示class的父级文件夹;最后记得要空格加一个"."
写在最后
具体的工具代码实现,最主要的命令就是上面这两个,如果遇到什么问题,欢迎留言~
项目的GitHub地址:ExportJarCommand
-
如何使用jar命令对java工程进行打包
2009-04-20 11:24:00一. jar命令用法: 在cmd命令窗口下...例子(这里介绍的都是生成双击可执行的jar包): 1.首先介绍如何在命令行下执行打包程序。 1.1.没有包结构的最简单的工程。 (1)在c:盘下新建文件“HelloWorld.java”:一. jar命令用法:
在cmd命令窗口下输入jar,回车,就会提示改命令的用法:
二.例子(这里介绍的都是生成双击可执行的jar包):
1.首先介绍如何在命令行下执行打包程序。
1.1.没有包结构的最简单的工程。
(1)在c:盘下新建文件“HelloWorld.java”:
1 public class HelloWorld
2 {
3 public static void main(String[] args){
4 System.out.println("Hello world!");
5 }
6 } (2)在命令行下输入c:/javac HelloWorld.java,在c:盘下编译生成“HelloWorld.class”。
(3)在c:盘下新建文件“menefest”(没有后缀名):
Main-Class: HelloWorld
注意最后要有一个空行,否则会出现找不到类的错误。
(4)打包:输入c:/jar cvmf menefest HelloWorld.jar HelloWorld.class,在c:盘下生成“HelloWorld.jar”。
(5)执行:输入c:/java -jar HelloWolrd.jar。屏幕回显“HelloWorld”。
1.2.有包结构的java工程。
(1)在c:/com/gosyl/demo/下新建文件“HelloWorld.java”:
package com.gosyl.demo;
public class HelloWorld{
public static void main(String[] args){
System.out.println("HelloWorld");
}
}
(2)在命令行下输入c:/javac com/gosyl/demo/HelloWorld.java,在c:/com/gosyl/demo/文件夹下编译生成“HelloWorld.class”。
(3)在c:盘下新建文件“menefest2”(没有后缀名):
Main-Class: com.gosyl.demo.HelloWorld
注意最后要有一个空行,冒号后面要一个空格。否则会出现找不到类的错误。
(4)打包:输入c:/jar cvmf menefest2 HelloWorld.jar com/,在c:盘下生成“HelloWorld.jar”。
(5)执行:输入c:/java -jar HelloWorld.jar。屏幕回显“HelloWorld”。
1.3.引用到外部jar包的java工程。
(1)在c:/com/gosyl/demo/下新建文件“Car.java”:
package com.gosyl.demo;
public class Car
{
public static void main(String[] args){
Light.on();
}
}
(2)在c:/com/gosyl/demo/下新建文件“Light.java”:
package com.gosyl.demo;
class Light
{
public static void on(){
System.out.println("Light is on!");
}
}
(3)打包1:输入c:/jar cvf Light.jar com/gosyl/demo/Light.class,在c:盘下生成“Light.jar”。
(4)在c:盘下新建文件“menefest-car”(没有后缀名):
Main-Class: com.gosyl.demo.Car
Class-Path: Light.jar
注意最后要有一个空行,冒号后面要一个空格。否则会出现找不到类的错误。
(5)打包2:输入c:/jar cvmf menefest-car Car.jar com/gosyl/demo/Car.class,在c:盘下生成“Car.jar”。
(6)执行:输入c:/java -jar Car.jar。屏幕回显“Light is on”。
三.总结
清单文件menifest,对格式要求很高,注意每个冒号后面要有一个空格,文件最后要有一个空行。对于引用到外部jar包的工程,需要在manifest中定义好Class-Path属性。 -
使用Maven为一个工程生成多个jar包
2020-02-25 22:04:07有时候我们需要在一个java工程内执行打包命令能生成多个jar包,每个jar包的具体内容都与具体实现类相绑定,这样的好处就是方便。比如我们项目中对外提供了插件扩展,第三方使用者只需要实现我们的插件接口,然后打成...目录
前言
有时候我们需要在一个java工程内执行打包命令能生成多个jar包,每个jar包的具体内容都与具体实现类相绑定,这样的好处就是方便。比如我们项目中对外提供了插件扩展,第三方使用者只需要实现我们的插件接口,然后打成jar包上传到我们的项目中便可动态解析,而使用者的需求便是能在一个工程内同时编辑多个业务插件,最终打包时也能生成多个不同的jar包以作不同的用途,因此作为产品方需要给出一个demo供他们直接上手。
实现
多模块实现
这个应该很好理解,可以使用多模块的方式实现,每个模块就相当于一个插件,最终打包时直接mvn package便能在不同模块的target目录下输出各自的jar包,实现简单,但是层次上存在一个父子关系,而实际上并不存在,因此不太好。
maven-assembly-plugin插件实现
使用该插件配合描述文件实现,整体项目结构如下图:
pom文件如下:
<?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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>qingcha.test</groupId> <artifactId>multiPluginDemo</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- 引入插件目标接口以及相关依赖 --> <dependency> <artifactId>hornet-web-api</artifactId> <groupId>uyun.hornet</groupId> <version>2.0.0-SNAPSHOT</version> <!-- 表示已提供依赖范围,由于是作为插件jar包运行在主项目中,而主项目中存在该依赖,因此实际运行的时候并不需要maven重复引入一遍, 因此该依赖范围表示只在测试和编译classpath时有效,在运行时无效,换句话说就是该依赖不会被打进包中--> <scope>provided</scope> </dependency> </dependencies> <!-- 在properties标签中定义的值可以通过使用${key}在pom的任何位置访问,其中key为属性值 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> <project.assembly.directory>src/main/resources/assembly</project.assembly.directory> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.6</version> <configuration> <!--该方式会将所有依赖打包到jar,生成的jar包带有jar-with-dependencies后缀 --> <descriptorRefs> <!-- 将依赖一起打包到 JAR --> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- 该标签可以配置主main类,即 使该jar包成为可执行jar包,可在META-INF下的MF文件中找到Main-class一行 --> <archive> <manifest> <mainClass></mainClass> </manifest> </archive> </configuration> <!-- 配置执行器,若还想增加编写新的插件,在此处新增执行器即可 --> <executions> <execution> <!-- 执行器id --> <id>plugin1</id> <!-- 绑定到maven的package生命周期 --> <phase>package</phase> <goals> <!-- 代表只运行一次 --> <goal>single</goal> </goals> <configuration> <descriptors> <!-- 描述文件的地址 --> <descriptor>${project.assembly.directory}/assembly-plugin1.xml</descriptor> </descriptors> <!-- 自定义包名,如果不配置则是 artifactId + version + assemblyId,配置后则为 finalName + assemblyId,当然也可以增加属性去除自动拼接assemblyId值 --> <finalName>multiPluginDemo</finalName> </configuration> </execution> <execution> <id>plugin2</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptors> <descriptor>${project.assembly.directory}/assembly-plugin2.xml</descriptor> </descriptors> <finalName>multiPluginDemo</finalName> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
其中打包脚本之一的assembly-plugin1.xml文件如下:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> <!-- 文件id,与前面保持一致即可 --> <id>plugin1</id> <!-- 是否生成和压缩包同名的项目和目录 --> <includeBaseDirectory>false</includeBaseDirectory> <formats> <!-- 指定格式 --> <format>jar</format> </formats> <fileSets> <fileSet> <!-- 文件所在项目中的位置 --> <directory>${project.build.outputDirectory}/qingcha/test/common</directory> <!-- 打包后的展示路径,必须与包路径保持一致 --> <outputDirectory>qingcha/test/common</outputDirectory> </fileSet> <fileSet> <directory>${project.build.outputDirectory}/qingcha/test/plugin1</directory> <outputDirectory>qingcha/test/plugin1</outputDirectory> </fileSet> <fileSet> <directory>src/main/resources/plugin1</directory> <!-- 由于依赖spi机制,因此这里的输出路径需要满足条件,否则插件便不生效了 --> <outputDirectory>META-INF/services</outputDirectory> </fileSet> </fileSets> </assembly>
最终直接使用mvn package打包即可,可在target/ 目录下看到最终的jar包,多个plugin会有多个jar包:
如果还要增加一个plugin的话,可依次增加对应的实现类、提供者配置文件、脚本描述文件、执行器
关于properties标签题外话(maven的内置变量)
在上面的脚本描述文件中有使用到 ${project.build.outputDirectory} ,然后查看pom文件发现我们并没有定义该key值,因此也能猜到这是maven的内置变量,常用的内置变量如下:
- ${project.basedir}:这引用了module/project的根文件夹(当前pom.xml文件所在的位置),还可以简化的写法:${basedir}
- ${project.build.directory}:这表示默认的target文件夹。
- ${project.build.outputDirectory}:默认情况下表示target/classes文件夹。
- ${project.build.testOutputDirectory}:这表示默认的target/test-classes文件夹。
- ${project.build.sourceDirectory}:这表示默认情况下src/main/java文件夹。
- ${project.build.testSourceDirectory}:这表示默认情况下src/test/java文件夹。
- ${project.build.finalName}:默认情况下定义为${project.artifactId}-${project.version}。
- ${project.version}:这可以在必须编写文字版本的位置使用,否则,特别是如果您在多模块构建模块间依赖关系。
- ${settings.localRepository}:它引用了本地存储库的位置。这是默认的${home}/.m2/repository。
-
Java打包指南-JAR文件包及jar命令详解
2011-06-15 15:54:57命令行打war包 jar -cvf filename.war ...1 进入命令行环境下,键入: cmd ...2 cd 到 web应用工程所在的目录下 ... 键入 jar -cvf agent.war *.* ...3 呵呵 成功啦,生成...Java打包指南-JAR文件包及jar命令详... -
MAVEN工程生成可执行的jar包
2019-10-08 07:06:50maven中的jar工程如果直接使用maven clean install来执行,生成的jar文件并不能使用 java -jar *.jar命令来执行。 解决方法: 在pom.xml中添加下面与<dependencies/>同级别的标签。 <build> <... -
IDEA 实现普通java工程,手动加入依赖包后,进行package jar包
2020-11-26 08:54:461、 2、 3、4、新建一个跟src同级的lib目录 5、 6、 7、 8、选中lib 9、10、 11、勾选上lib 12、写一个入口main方法 ...17、生成的jar包 ...18、使用CMD命令,找到jar包所在位置,执行一下jar包,成功 ... -
Java编译打包命令
2020-12-22 21:53:40我们有的时候总是要使用将自己写的工程编译成 class 文件,同时打包成 jar,虽然有各种工具可以帮助我们,但是毕竟掌握使用 java 本来的命令去做这些更灵活 编译 比如我要编译包名为 com.demo,全称为 ... -
Java进阶学习:jar打包详解(二) 用MyEclipse自动生成
2010-10-09 16:10:00都是说什么用jar命令对java工程进行打包 我看了哈子,觉的有点复杂.其实,用MyEclipse 打成JAR包,简单.快速 具体操作如下: 1.点项目反键->Export 如图: <br />选择jar file 下一步 <br />下... -
Java 编译打包命令
2017-01-15 20:55:00我们有的时候总是要使用将自己写的工程编译成 class 文件,同时打包成 jar,虽然有各种工具可以帮助我们,但是毕竟掌握使用 java 本来的命令去做这些更灵活 编译 比如我要编译包名为 com.demo,全称为 ... -
maven工程打包成runnable的jar包,拷贝资源和依赖jar包
2016-07-03 19:27:19方法一:将项目及所依赖的所有jar包打包成一个jar。 1、pom.xml添加assembly插件(放在最外层) 2、执行在所在跟部门中执行命令mvn assembly:assembly 3、target文件夹中生成如下文件 4、执行... -
将Java程序打包成jar并执行
2017-10-10 20:49:40MANIFEST.MF文件可以由eclipse自动生成,也可以指定外部导入运行jar包的命令 java -jar helloworld.jar 如果在工程中用到了其他的jar包,虽然使用eclipse打包是可以看到引用的jar包已经加入到自己的jar中了,但是... -
使用Apache CXF cxf-codegen-plugin生成webservice客户端jar包
2020-05-24 23:25:45背景 使用Apache CXF生成客户端代码有两种方式 方式一 在官网http://cxf.apache.org下载...如果你希望将客户端打成jar包,可以用CXF的maven plugin。IDEA为例打包步骤如下: 1. 新建maven工程,引入plugin依赖. -
JAR包引用其它JAR包的classpath问题
2018-03-25 17:44:54运行jar包的命令:java -jar hello.jar不过如果工程引用到了其它jar,虽然用ide工具打包时可以看到引用的JAR已经加入到了自己的JAR中,但运行时却会提示ClassNotFoundException。此时需要修改ide工具自动生成的hello... -
Maven项目编译打包命令
2018-12-25 13:02:24在Eclipse中的pom.xml上可以执行Maven有关命令 1、编译 compile 1.1右键Run As,选择2 Maven build,在目标Goals中录入compile ...支持动态打包,web工程生成war包,Java工程生成jar包,我的项目是java 控... -
java war包怎么运行_springboot web项目打jar或者war包并运行的实现
2021-02-28 10:54:03(一)springboot web项目打jar包1、打包两种打包方式maven命令打包切换目录到工程根下,pom.xml所在位置,运行maven的打包命令mvn clean package -Dmaven.test.skip=trueIDEA 工具执行maven任务打包会在xxx项目模块下... -
java原生命令编译与运行,javac与jar
2018-03-25 23:25:49用到第三发jar包3.多个包多级目录的java工程 我试了一下,下面三种方式都可以,可用通配符。 ps: 常用-d classes将生成的.class文件指定到目录,以便打jar。不加则在java文件统计目录。 C:\Users\15164\Desktop&... -
Maven导入本地lib,将依赖包融合本工程业务代码导出,Java命令执行主类
2019-05-17 21:42:051、无需在pom.xml中配置build,在Maven视图中点击Lifecycle-package,再点击其中的运行,即可默认在工程目录生成target文件夹,其中有src-main对应的jar包。关于target的内容,请看:... -
springboot的jar包与war包的区别
2019-07-23 23:04:33spring-boot 默认提供内嵌的tomcat,所以打包直接生成jar 包,用java-jar 命令就可以启动。但是,有时候我们更希望一个tomcat 来管理多个项目或者使用jetty、netty等其他web服务器,这种情况下就需要项目是war 包而... -
Android 执行JAR包
2017-09-15 20:01:00简单几步操作在android中执行jar工程中新建New Module...解压aar得到jar包,注意该jar包还是java字节码的,需要转换下,通过Sdk\build-tools\XXXXXX\dx.bat命令,转换为android可用的jar包 将jar包push到手机执行执行j -
超简单方法: Intellij Idea 把 java 工程打成可运行的 jar
2018-08-16 20:43:122. 在光标位置输入命令:mvn clean 。...3. 输入打 jar 包的命令:mvn install -Dmaven.test.skip=true (-Dmaven.test.skip=true :路过自动测试) 4.从提示所指示的目录找到新生成的 j... -
利用Maven插件保证jar包启动时自动关联依赖jar包
2018-04-20 16:53:49当我使用maven管理工程结构时,我们的项目如果不是web项目,最终会生成一个jar文件,当我们使用java命令执行该jar文件时,不仅需要指定jar包中MainClass路径,而且还要通过脚本命令把依赖的jar包配置进去,这样非常... -
关于Jar命令
2010-12-30 20:59:00<br />jar cvf 输出文件名 文件列表 如: jar cvf... 比如,在命令提示符下,当前目录为code,code下面有个test工程,test工程里面就是一些class文件(可能有一些Java包),这时候怎么打包? code -
MapReduce项目如何输出jar包?
2019-07-17 17:06:47右键单击工程,点开“Export…”,在弹出的对话框中选择“java/JAR file”, 这样就会生成到项目的根目录的上一层,针对生成的“WordCount.jar”,通过以下命令执行程序: hadoop jar WordCount.jar /README.txt /... -
Android编译应用可导入的jar包
2019-12-06 18:51:51Android使用jack编译系统后,Android.mk编译,生成的jar中是classes.dex,不能被工程引用,因此需要编译出包含*.class的jar 编译方式为: 在代码的目录下执行mk文件自动生成的目录,例如Himw.jar 执行命令如下: mm... -
maven 打可执行jar包 打入所有依赖 包括本地依赖
2016-02-19 21:12:00稍微大点的项目都会用 maven 或者 ant 来构建,在 maven 工程中,...默认Maven生成的JAR包只包含了编译生成的.class文件和项目资源文件,而要得到一个可以直接在命令行通过 java命令运行的JAR文件,还要满足两个条件... -
Android开发使用javah命令生成头文件, 如果类引用了外部包的类型怎么生成?
2015-05-13 10:56:10``` ... import java.util.ArrayList; ... ...public class ExtraRoute { public static native ArrayList<LatLng> getDrivePath(double[]...com.abcdefg.LatLng是我导入工程里面其他Jar包里面的类 请问这种问题如何解决? -
mysql generator 命令_从命令行及java程序运行MyBatis Generator 1.3.x生成MyBatis3.x代码
2021-02-07 08:08:36近期因为项目需要,调研了myBatis 3.x的使用,当然,顺便也就研究了一下使用Generator来通过逆向工程生成pojo,mapper等文件。使用这个工具之前,要先下载相关的jar包,我使用的是最新的mybatis-generator-core-...