Maven 辅助小脚本
发布于 2 年前 阅读权限 无需登录 作者 n1nty 2321 次浏览 来自 知识碎片

本贴与安全不直接相关。 我不知道有没有别的更方便的方法来解决下面描述到的问题,所以我写了这个脚本。如果你知道更好的方法,请回贴分享一下。:)

使用场景 当你拿到一套 WEB 程序的代码,出于方便的原因你想用 Maven 来构建它,但是程序本身不是基于 Maven 的,你需要做以下事情:

  1. 添加 pom.xml
  2. 在 pom.xml 中添加相关依赖 如果程序中有大量依赖的 jar 存在于 WEB-INF/lib 下这就很蛋疼了。你要把所有的 jar 转换为 dependency 并写入到 pom.xml 中。否则你将无法使用 maven 来编译这个工程。更蛋疼的是这些 jar 并不一定在公有 Maven 仓库中存在。

所以我写了一个辅助小脚本来解决这个问题。

使用步骤:

  1. 将下面的 python 脚本保存到工程目录,文件名为 mavenlocal
  2. 在工程目录下创建 maven-local-repo
  3. 将 web-inf/lib 下的 jar(或者任何位于其它地方的依赖) 全都剪切到 maven-local-repo 目录下面
  4. 在工程目录运行
eval "$(mavenlocal ./local-maven-repo/ deploy)"

上面这条命令会将 local-maven-repo 目录下的所有 jar 安装到当前工程的本地仓库里面去。然后运行

mavenlocal ./local-maven-repo/ xml

将生成 xml 的配置,将这些配置添加到 pom.xml 里面就可以了。

mavenlocal 代码如下,需要 Python3

#!/usr/bin/env python3
import os
import sys
import collections

repo = './local-maven-repo/'
Dependency = collections.namedtuple('Dependency', ['groupid', 'artifactid', 'version', 'file'])


def make_dependency(jar, dir):
	f = jar[:-4] 
	try:
		filename, version = f.rsplit('-', 1)
	except:
		filename, version = [f, '0.0']
		
	return Dependency(groupid=filename, artifactid=filename, version=version, file=os.path.join(dir, jar))
	
def make_command(dependency):
	return 'mvn deploy:deploy-file -DgroupId={groupid} -DartifactId={artifactid} -Dversion={version} -Durl=file:{repo} -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile={file}'.format(groupid=dependency.groupid, artifactid=dependency.artifactid, version=dependency.version, repo=repo, file=dependency.file)

def make_xml(dependency):
	return '''<dependency>
	<groupId>{groupid}</groupId>
	<artifactId>{artifactid}</artifactId>
	<version>{version}</version>
</dependency>'''.format(groupid=dependency.groupid, artifactid=dependency.artifactid, version=dependency.version)

filename, dir, action = sys.argv
jars = [f for f in os.listdir(dir) if f.endswith('.jar')]


dependencies = [make_dependency(jar, dir) for jar in jars]

if action == 'deploy':
	for dependency in dependencies:
		print(make_command(dependency))
elif action == 'xml':
	print('<dependencies>')
	for dependency in dependencies:
		print(make_xml(dependency))
	print('</dependencies>')
	print('''<repositories>
	    <repository>
	      <id>local-maven-repo</id>
	      <url>file:///${project.basedir}/local-maven-repo</url>
	    </repository>
	  </repositories>
''')
6 回复

好东西居然没人顶

准备搭建一个虚拟机弄好一个环境,Maven用好了是很方便的。

遇到过这样的需求,实用!

回到顶部