新人关于maven依赖后发布的疑问

难题 2020-05-28 02:47:21
例如:公司内部有一个maven仓库但是不对外开放,里面有一个基础包A,基本后面的所有项目都会依赖这个A
现在我写了一个maven项目B,依赖了jar包A(是从仓库里面依赖的,不是下载到本地来依赖的),完成后,要把我B项目生成的B.jar外发。
运行项目B的package后的jar只有我当前的项目B的class文件。如果外发肯定别人肯定是用不了的,因为少了A包
现在我的问题是:
1 是不是要把A打包进入我的B.jar内才可以?
2 如果是要把A打包进B,那么A是放到哪里,才不会导致B的依赖出错
maven新手,请大家不吝赐教,谢谢了

...全文
480 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
难题 2020-06-15
  • 打赏
  • 举报
回复
结贴了,现在还是使用我之前使用那个POM,把所有的依赖都放到一个LIB中,不过写了一个说明,说明那些是第三方库文件
难题 2020-06-09
  • 打赏
  • 举报
回复
现在我的一个想法就是,除了必要的jar包,都使用pom来依赖,其他自己的jar,就用MANIFEST.MF的Class-Path来依赖,不过这样就不好写pom的依赖了
难题 2020-06-09
  • 打赏
  • 举报
回复
引用 15 楼 tianfang 的回复:
如果A.jar带第三方库,你的B项目就不应该包含相同的第三方库,或者像楼上说的,用scope=provided ,test解决 还有一个方法, 你A.jar的pom是可以包含dependency,A.jar只包含自写代码,把A的所有依赖写在pom中。这样B项目会合并处理依赖 看看这个SLF4J LOG4J-12 Binding https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12/2.0.0-alpha1 其中的pom https://repo1.maven.org/maven2/org/slf4j/slf4j-log4j12/2.0.0-alpha1/slf4j-log4j12-2.0.0-alpha1.pom
现在的问题是,公司内部的A.JAR是使用maven的,就是说jar包内部是有pom的,现在我的B.JAR因为要外发,所以只能使用本地依赖的方式来处理了,这样jar里面就不能包含pom,只是在MANIFEST.MF的Class-Path里面写明了A.JAR路径。这样我会生成lib文件夹,里面包含了A.JAR和写日志的jar包。如果我不包含写日志的jar包的话,别人使用我的B.JAR就会报找不到写日志的jar;如果我包含写日志的jar包话,别人在依赖写日志的包就会出现包冲突
tianfang 2020-06-09
  • 打赏
  • 举报
回复
引用 16 楼 难题 的回复:
[quote=引用 14 楼 tianfang 的回复:] [quote=引用 7 楼 难题 的回复:] [quote=引用 6 楼 qybao 的回复:] [quote=引用 4 楼 难题 的回复:] A包只在公司的仓库里面,而且不对外开放,所以我发出去的包别人是下载不到A包的
你试过设定MANIFEST.MF的Class-Path的方法了吗? MANIFEST.MF设定详解可以参考以下 https://www.cnblogs.com/easonjim/p/6485677.html 假设你的b.jar里有个文件夹aaa,把A.jar放到该文件夹,然后写个MANIFEST.MF文件,Class-Path设定为 Class-Path: ./ ./aaa/A.jar 把MANIFEST.MF文件和b的资源一起打包B.jar [/quote] 非常感谢,我现在就是这样做的,在B.JAR内部建一个lib文件夹,把依赖的jar都放到里面去了,又去除了maven相关。 这样又出现了一个新的问题,就是依赖库冲突的问题,例如:A.jar里面使用到了写日志的第三方库logback-classic,B.JAR里面也用到了这个库文件,打包的时候肯定要把这个第三方库文件打包进去。结果就是如果别人使用maven来依赖我的B.JAR又还要依赖的logback-classic库文件,就会出现出文件冲突。[/quote] 这个冲突的可以通过dependency的scope解决,provided ,test都可以,都不会打入包中
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>1.5.2</version>
            <scope>provided</scope>
        </dependency
[/quote] 我之前也想过使用scope来解决这个问题,结果实验过之后不行。因为如果不打包写日志的库的话,如果别人也没有依赖写日志的库就会报错[/quote] 用15楼的方法吧
难题 2020-06-09
  • 打赏
  • 举报
回复
引用 14 楼 tianfang 的回复:
[quote=引用 7 楼 难题 的回复:] [quote=引用 6 楼 qybao 的回复:] [quote=引用 4 楼 难题 的回复:] A包只在公司的仓库里面,而且不对外开放,所以我发出去的包别人是下载不到A包的
你试过设定MANIFEST.MF的Class-Path的方法了吗? MANIFEST.MF设定详解可以参考以下 https://www.cnblogs.com/easonjim/p/6485677.html 假设你的b.jar里有个文件夹aaa,把A.jar放到该文件夹,然后写个MANIFEST.MF文件,Class-Path设定为 Class-Path: ./ ./aaa/A.jar 把MANIFEST.MF文件和b的资源一起打包B.jar [/quote] 非常感谢,我现在就是这样做的,在B.JAR内部建一个lib文件夹,把依赖的jar都放到里面去了,又去除了maven相关。 这样又出现了一个新的问题,就是依赖库冲突的问题,例如:A.jar里面使用到了写日志的第三方库logback-classic,B.JAR里面也用到了这个库文件,打包的时候肯定要把这个第三方库文件打包进去。结果就是如果别人使用maven来依赖我的B.JAR又还要依赖的logback-classic库文件,就会出现出文件冲突。[/quote] 这个冲突的可以通过dependency的scope解决,provided ,test都可以,都不会打入包中
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>1.5.2</version>
            <scope>provided</scope>
        </dependency
[/quote] 我之前也想过使用scope来解决这个问题,结果实验过之后不行。因为如果不打包写日志的库的话,如果别人也没有依赖写日志的库就会报错
难题 2020-06-03
  • 打赏
  • 举报
回复
引用 10 楼 tianfang 的回复:
这是我的pom 两代打包方式都在里面, 依赖jar拷贝到lib,见                 <artifactId>maven-dependency-plugin</artifactId> maven 管理的jar打包 见                 <artifactId>maven-assembly-plugin</artifactId>
你好,这个是一个很好的打包方式,但是问题和我上面说的一样,会有第三方包冲突 例如:你的history依赖了logback-classic,新建一个helloworld项目引用history,又依赖了logback-classic,运行时就会出现logback-classic包冲突的问题
tianfang 2020-06-03
  • 打赏
  • 举报
回复
如果A.jar带第三方库,你的B项目就不应该包含相同的第三方库,或者像楼上说的,用scope=provided ,test解决 还有一个方法, 你A.jar的pom是可以包含dependency,A.jar只包含自写代码,把A的所有依赖写在pom中。这样B项目会合并处理依赖 看看这个SLF4J LOG4J-12 Binding https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12/2.0.0-alpha1 其中的pom https://repo1.maven.org/maven2/org/slf4j/slf4j-log4j12/2.0.0-alpha1/slf4j-log4j12-2.0.0-alpha1.pom
tianfang 2020-06-03
  • 打赏
  • 举报
回复
引用 7 楼 难题 的回复:
[quote=引用 6 楼 qybao 的回复:] [quote=引用 4 楼 难题 的回复:] A包只在公司的仓库里面,而且不对外开放,所以我发出去的包别人是下载不到A包的
你试过设定MANIFEST.MF的Class-Path的方法了吗? MANIFEST.MF设定详解可以参考以下 https://www.cnblogs.com/easonjim/p/6485677.html 假设你的b.jar里有个文件夹aaa,把A.jar放到该文件夹,然后写个MANIFEST.MF文件,Class-Path设定为 Class-Path: ./ ./aaa/A.jar 把MANIFEST.MF文件和b的资源一起打包B.jar [/quote] 非常感谢,我现在就是这样做的,在B.JAR内部建一个lib文件夹,把依赖的jar都放到里面去了,又去除了maven相关。 这样又出现了一个新的问题,就是依赖库冲突的问题,例如:A.jar里面使用到了写日志的第三方库logback-classic,B.JAR里面也用到了这个库文件,打包的时候肯定要把这个第三方库文件打包进去。结果就是如果别人使用maven来依赖我的B.JAR又还要依赖的logback-classic库文件,就会出现出文件冲突。[/quote] 这个冲突的可以通过dependency的scope解决,provided ,test都可以,都不会打入包中
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>1.5.2</version>
            <scope>provided</scope>
        </dependency
Forevermark993 2020-06-03
  • 打赏
  • 举报
回复
别人引用你的包,他会自动去你们公司私服下载你的包的依赖 如果是给外部的人用,就必须把你依赖的这个包也发布出去
tianfang 2020-06-02
  • 打赏
  • 举报
回复
打包效果
tianfang 2020-06-02
  • 打赏
  • 举报
回复
这是我的pom 两代打包方式都在里面, 依赖jar拷贝到lib,见                 <artifactId>maven-dependency-plugin</artifactId> maven 管理的jar打包 见                 <artifactId>maven-assembly-plugin</artifactId>
tianfang 2020-06-02
  • 打赏
  • 举报
回复


<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>org.xxxxx</groupId>
	<artifactId>history</artifactId>
	<version>1.0</version>

	<build>
		<defaultGoal>compile</defaultGoal>
		<plugins>

			<!-- 把依赖的jar包拷到lib目录下 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<id>copy-dependencies</id>
						<phase>package</phase>
						<goals>
							<goal>copy-dependencies</goal>
						</goals>
						<configuration>
							<outputDirectory>${project.build.directory}/lib</outputDirectory>
							<overWriteReleases>false</overWriteReleases>
							<overWriteSnapshots>false</overWriteSnapshots>
							<overWriteIfNewer>true</overWriteIfNewer>
						</configuration>
					</execution>
				</executions>
			</plugin>


			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>2.6</version><!--$NO-MVN-MAN-VER$-->
				<configuration>
					<appendAssemblyId>false</appendAssemblyId>
					<descriptorRefs>
						<descriptorRef>jar-with-dependencies</descriptorRef>
					</descriptorRefs>
					<archive>
						<manifest>
							<mainClass>org.tianfang.dcball.HistoryBL</mainClass>
						</manifest>
					</archive>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>assembly</goal>
						</goals>
					</execution>
				</executions>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.1</version>
				<configuration>
					<source>11</source>
					<target>11</target>
					<release>11</release>
				</configuration>
			</plugin>
		</plugins>


	</build>


	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
	</properties>


	<dependencies>



		<!-- https://mvnrepository.com/artifact/javax.json/javax.json-api -->
		<dependency>
			<groupId>javax.json</groupId>
			<artifactId>javax.json-api</artifactId>
			<version>1.1.4</version>
		</dependency>

		<dependency>
			<groupId>org.glassfish</groupId>
			<artifactId>javax.json</artifactId>
			<version>1.1.4</version>
		</dependency>
		<dependency>
			<groupId>org.openjfx</groupId>
			<artifactId>javafx-controls</artifactId>
			<version>11.0.2</version>
			<scope>provided</scope>
		</dependency>
				<dependency>
			<groupId>org.openjfx</groupId>
			<artifactId>javafx-web</artifactId>
			<version>11.0.2</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.junit.platform</groupId>
			<artifactId>junit-platform-launcher</artifactId>
			<version>1.5.2</version>
			<scope>provided</scope>
		</dependency>


		<dependency>
			<groupId>org.junit.jupiter</groupId>
			<artifactId>junit-jupiter-engine</artifactId>
			<version>5.5.2</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.junit.vintage</groupId>
			<artifactId>junit-vintage-engine</artifactId>
			<version>5.5.2</version>
			<scope>provided</scope>
		</dependency>



	</dependencies>
</project>



难题 2020-06-01
  • 打赏
  • 举报
回复
我使用的打包参考的则为仁兄的https://blog.csdn.net/qq804702802/article/details/47838241#
难题 2020-06-01
  • 打赏
  • 举报
回复
引用 6 楼 qybao 的回复:
[quote=引用 4 楼 难题 的回复:] A包只在公司的仓库里面,而且不对外开放,所以我发出去的包别人是下载不到A包的
你试过设定MANIFEST.MF的Class-Path的方法了吗? MANIFEST.MF设定详解可以参考以下 https://www.cnblogs.com/easonjim/p/6485677.html 假设你的b.jar里有个文件夹aaa,把A.jar放到该文件夹,然后写个MANIFEST.MF文件,Class-Path设定为 Class-Path: ./ ./aaa/A.jar 把MANIFEST.MF文件和b的资源一起打包B.jar [/quote] 非常感谢,我现在就是这样做的,在B.JAR内部建一个lib文件夹,把依赖的jar都放到里面去了,又去除了maven相关。 这样又出现了一个新的问题,就是依赖库冲突的问题,例如:A.jar里面使用到了写日志的第三方库logback-classic,B.JAR里面也用到了这个库文件,打包的时候肯定要把这个第三方库文件打包进去。结果就是如果别人使用maven来依赖我的B.JAR又还要依赖的logback-classic库文件,就会出现出文件冲突。
qybao 2020-05-29
  • 打赏
  • 举报
回复
引用 4 楼 难题 的回复:
A包只在公司的仓库里面,而且不对外开放,所以我发出去的包别人是下载不到A包的

你试过设定MANIFEST.MF的Class-Path的方法了吗?
MANIFEST.MF设定详解可以参考以下
https://www.cnblogs.com/easonjim/p/6485677.html
假设你的b.jar里有个文件夹aaa,把A.jar放到该文件夹,然后写个MANIFEST.MF文件,Class-Path设定为
Class-Path: ./ ./aaa/A.jar
把MANIFEST.MF文件和b的资源一起打包B.jar

tianfang 2020-05-28
  • 打赏
  • 举报
回复
补充一下,用maven导入依赖的包,如果项目没有lib目录,则把a jar包打散,按包目录放进b.jar中
难题 2020-05-28
  • 打赏
  • 举报
回复
引用 2 楼 qybao 的回复:
1 不一定,看用户的需求,因为别人也可以单独去下载A包 2 那你的A包就不应该是maven依赖了,而是下载好后放到B项目的某个目录(且该目录在B的build路径),该目录也一起打包进B里,用户的可以在classpath里添件B.jar/某个目录/A.jar或者直接在B的jar包的MANIFEST.MF里修改Class-Path的路径添加某个目录先的A.jar
A包只在公司的仓库里面,而且不对外开放,所以我发出去的包别人是下载不到A包的
难题 2020-05-28
  • 打赏
  • 举报
回复
引用 1 楼 tianfang 的回复:
1 是 2 A.jar放在b的lib下,如果有源码,也可能是引入源码
因为我是使用的IDEA的,默认是没有lib目录的,依赖A.jar都是直接在pom里面dependency公司的仓库。引入源码这个应该是不允许的
qybao 2020-05-28
  • 打赏
  • 举报
回复
1 不一定,看用户的需求,因为别人也可以单独去下载A包
2 那你的A包就不应该是maven依赖了,而是下载好后放到B项目的某个目录(且该目录在B的build路径),该目录也一起打包进B里,用户的可以在classpath里添件B.jar/某个目录/A.jar或者直接在B的jar包的MANIFEST.MF里修改Class-Path的路径添加某个目录先的A.jar
tianfang 2020-05-28
  • 打赏
  • 举报
回复
1 是 2 A.jar放在b的lib下,如果有源码,也可能是引入源码

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧