JPA dev: 几个问题总结

本文通过一个具体的例子展示了Java持久化API (JPA) 中不同实体间的各种关系映射方式,包括一对一、一对多及单向关联等,并提供了完整的实体类定义和配置文件。

最近工作中遇到几个与JPA相关的问题,本文通过一个例子总结一下这些问题。

1 给出一个例子:

如下图表式Persistent Context中所有实体的关系图:



 从图中可以看到:

所有实体间对应关系都是单向的;

User和Event,User和Friend,Event和Property,Wife和Pet,Pet和Property关系为一对多关系;

User和UserCard,Friend和UserCard,Wife和UserCard,User和Wife之间的关系是一对一关系;

http://kylinsoong.iteye.com/blog/807937所示创建工程;

贴出相关代码:

package com.tibco.hibernate.po;

import java.util.Calendar;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.ForeignKey;


@Entity(name="User")
@Table(name="k_user")
public class User {
	private Long id;
	private String name;
	private List<Event> events;
	private List<Friend> friends;
	private UserCard userCard;
	private Wife wife;
	private Calendar createdDate;
	private Boolean isMale;

	@Column
	@Id
	@GeneratedValue
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Column
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@OneToMany (
			targetEntity=com.tibco.hibernate.po.Event.class,
			fetch=FetchType.LAZY,
			cascade = { CascadeType.ALL })
	@Cascade( { org.hibernate.annotations.CascadeType.ALL } ) 
	@JoinTable(name="k_user_event", 
			joinColumns = @JoinColumn(name = "USER_ID"), 
			inverseJoinColumns = @JoinColumn(name = "EVENT_ID"))
	@ForeignKey(name = "k_user_event_FK", 
			inverseName = "k_user_event_FK_R")
	public List<Event> getEvents() {
		return events;
	}

	public void setEvents(List<Event> events) {
		this.events = events;
	}

	@OneToMany (
			targetEntity=com.tibco.hibernate.po.Friend.class,
			fetch=FetchType.EAGER,
			cascade = { CascadeType.ALL })
	@Cascade( { org.hibernate.annotations.CascadeType.ALL } ) 
	@JoinTable(name="k_user_friend", 
			joinColumns = @JoinColumn(name = "USER_ID"), 
			inverseJoinColumns = @JoinColumn(name = "FRIEND_ID"))
	@ForeignKey(name = "k_user_friend_FK", 
			inverseName = "k_user_friend_FK_R")
	public List<Friend> getFriends() {
		return friends;
	}

	public void setFriends(List<Friend> friends) {
		this.friends = friends;
	}

	@OneToOne(
			targetEntity = com.tibco.hibernate.po.UserCard.class, 
    		fetch = FetchType.EAGER, 
    		cascade = { CascadeType.ALL })
    @Cascade( { org.hibernate.annotations.CascadeType.ALL } )    		
	@JoinColumn(name = "UserCard_id")
	@ForeignKey(name = "USER_TO_USERCARD_FK")  
	public UserCard getUserCard() {
		return userCard;
	}

	public void setUserCard(UserCard userCard) {
		this.userCard = userCard;
	}

	@OneToOne(
			targetEntity = com.tibco.hibernate.po.Wife.class, 
    		fetch = FetchType.EAGER, 
    		cascade = { CascadeType.ALL })
    @Cascade( { org.hibernate.annotations.CascadeType.ALL } )    		
	@JoinColumn(name = "Wife_id")
	@ForeignKey(name = "USER_TO_WIFE_FK") 
	public Wife getWife() {
		return wife;
	}

	public void setWife(Wife wife) {
		this.wife = wife;
	}

	@Column(name = "CREATEDDATE")
    @Temporal(TemporalType.DATE)
	public Calendar getCreatedDate() {
		return createdDate;
	}

	public void setCreatedDate(Calendar createdDate) {
		this.createdDate = createdDate;
	}

	@Column
	public Boolean getIsMale() {
		return isMale;
	}

	public void setIsMale(Boolean isMale) {
		this.isMale = isMale;
	}


}

 

package com.tibco.hibernate.po;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.ForeignKey;

@Entity(name="Event")
@Table(name="k_event")
public class Event {
	private Long id;
	private String name;
	private List<Property> properties;

	@Column
	@Id
	@GeneratedValue
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Column
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@OneToMany (
			targetEntity=com.tibco.hibernate.po.Property.class,
			fetch=FetchType.LAZY,
			cascade = { CascadeType.ALL })
	@Cascade( { org.hibernate.annotations.CascadeType.ALL } ) 
	@JoinTable(name="k_event_property", 
			joinColumns = @JoinColumn(name = "EVENT_ID"), 
			inverseJoinColumns = @JoinColumn(name = "PROPERTY_ID"))
	@ForeignKey(name = "k_event_property_FK", 
			inverseName = "k_event_property_FK_R")
	public List<Property> getProperties() {
		return properties;
	}

	public void setProperties(List<Property> properties) {
		this.properties = properties;
	}

}

 

package com.tibco.hibernate.po;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity(name="Property")
@Table(name="k_property")
public class Property {
	private Long id;
	private String name;
	
	@Column
	@Id
	@GeneratedValue
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Column
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String toString() {
		return "Property [id=" + id + ", name=" + name + "]";
	}

}

 

package com.tibco.hibernate.po;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.ForeignKey;

@Entity(name="Friend")
@Table(name="k_friend")
public class Friend {
	private Long id;
	private String name;
	private UserCard userCard;

	@Column
	@Id
	@GeneratedValue
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Column
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	@OneToOne(
			targetEntity = com.tibco.hibernate.po.UserCard.class, 
    		fetch = FetchType.EAGER, 
    		cascade = { CascadeType.ALL })
    @Cascade( { org.hibernate.annotations.CascadeType.ALL } )    		
	@JoinColumn(name = "UserCard_id")
	@ForeignKey(name = "FRIEND_TO_USERCARD_FK")  
	public UserCard getUserCard() {
		return userCard;
	}

	public void setUserCard(UserCard userCard) {
		this.userCard = userCard;
	}

	public String toString() {
		return "Friend [id=" + id + ", name=" + name + "]";
	}
}

 

package com.tibco.hibernate.po;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity(name="UserCard")
@Table(name="k_userCard")
public class UserCard {
	private Long id;
	private String cardNumber;

	@Column
	@Id
	@GeneratedValue
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Column
	public String getCardNumber() {
		return cardNumber;
	}

	public void setCardNumber(String cardNumber) {
		this.cardNumber = cardNumber;
	}
}

 

package com.tibco.hibernate.po;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.ForeignKey;

@Entity(name="Wife")
@Table(name="k_wife")
public class Wife {
	private Long id;
	private String name;
	private UserCard userCard;
	private List<Pet> pets;

	@Column
	@Id
	@GeneratedValue
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Column
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@OneToOne(
			targetEntity = com.tibco.hibernate.po.UserCard.class, 
    		fetch = FetchType.EAGER, 
    		cascade = { CascadeType.ALL })
    @Cascade( { org.hibernate.annotations.CascadeType.ALL } )    		
	@JoinColumn(name = "UserCard_id")
	@ForeignKey(name = "Wife_TO_USERCARD_FK")
	public UserCard getUserCard() {
		return userCard;
	}

	public void setUserCard(UserCard userCard) {
		this.userCard = userCard;
	}

	@OneToMany (
			targetEntity=com.tibco.hibernate.po.Pet.class,
			fetch=FetchType.LAZY,
			cascade = { CascadeType.ALL })
	@Cascade( { org.hibernate.annotations.CascadeType.ALL } ) 
	@JoinTable(name="k_wife_pet", 
			joinColumns = @JoinColumn(name = "WIFE_ID"), 
			inverseJoinColumns = @JoinColumn(name = "PET_ID"))
	@ForeignKey(name = "k_wife_pet_FK", 
			inverseName = "k_wife_pet_FK_R")
	public List<Pet> getPets() {
		return pets;
	}

	public void setPets(List<Pet> pets) {
		this.pets = pets;
	}

	
	
}

 

package com.tibco.hibernate.po;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.ForeignKey;

@Entity(name="Pet")
@Table(name="k_pet")
public class Pet {

	private Long id;
	private String name;
	private List<Property> properties;

	@Column
	@Id
	@GeneratedValue
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Column
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@OneToMany (
			targetEntity=com.tibco.hibernate.po.Property.class,
			fetch=FetchType.LAZY,
			cascade = { CascadeType.ALL })
	@Cascade( { org.hibernate.annotations.CascadeType.ALL } ) 
	@JoinTable(name="k_pet_property", 
			joinColumns = @JoinColumn(name = "EVENT_ID"), 
			inverseJoinColumns = @JoinColumn(name = "PROPERTY_ID"))
	@ForeignKey(name = "k_pet_property_FK", 
			inverseName = "k_pet_property_FK_R")
	public List<Property> getProperties() {
		return properties;
	}

	public void setProperties(List<Property> properties) {
		this.properties = properties;
	}
}

 

贴出persistence.xml配置:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
	version="1.0">
	<persistence-unit name="com.tibco.hibernate.po">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>com.tibco.hibernate.po.Event</class>
		<class>com.tibco.hibernate.po.Friend</class>
		<class>com.tibco.hibernate.po.Pet</class>
		<class>com.tibco.hibernate.po.Property</class>
		<class>com.tibco.hibernate.po.User</class>
		<class>com.tibco.hibernate.po.UserCard</class>
		<class>com.tibco.hibernate.po.Wife</class>
		<properties>
	</properties>
				
	</persistence-unit>
</persistence>

 

数据库配置信息:

hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

#connection
hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
hibernate.connection.username=IPC113
hibernate.connection.password=bpm
hibernate.connection.url=jdbc:oracle:thin:@//192.168.68.120:1521/orcl

#pool 
hibernate.c3p0.min_size=1
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50

 

在J2SE下使用JPA需要EntityManager对Persistent context中的实体与数据库同步,EntityManager由EntityManagerFactory产生,给出产生EntityManagerFactory的工具类:

package com.tibco.hibernate.jpa;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class JPAUtil {

	public static final String POJO_PACKAGE = "com.tibco.hibernate.po";

	public static EntityManagerFactory createEMF(String dbproperties)
			throws IOException {
		Properties persistenceProperties = loadProperties(dbproperties);

		return Persistence.createEntityManagerFactory(POJO_PACKAGE,
				persistenceProperties);
	}
	
	public static Properties loadProperties(String dbproperties) throws IOException {
		Properties persistenceProperties = loadFromResource(dbproperties+".properties");
		
		return persistenceProperties;
	}

	private static Properties loadFromResource(String resourceName)
			throws IOException {
		Properties p = new Properties();
		InputStream is = new FileInputStream(new File(resourceName));
		try {
			p.load(is);
		} finally {
			try {
				if (is != null)
					is.close();
			} catch (IOException ignored) {
			}
		}

		return p;
	}

}

 

先在向数据库中插入一条数据:

public class JPAClient {

	public static void main(String[] args) throws Throwable {
		EntityManagerFactory emf = JPAUtil.createEMF("oracle");
		EntityManager em = emf.createEntityManager();
		EntityTransaction t = em.getTransaction();
		t.begin();
		
		User user = getUser();
		em.persist(user);
		
		t.commit();
		em.close();
		emf.close();
	}

private static boolean isProxyProperty(Object obj) throws Throwable {
	String name = obj.getClass().getName();
	return name.contains("_$$_javassist_") || name.contains("org.hibernate.collection.PersistentBag");
}

	private static User getUser() {
		List<Event> events = getEventList();
		List<Friend> friends = getFriendList();
		UserCard userCard = new UserCard();
		userCard.setCardNumber("user usercard number");
		Wife wife = getWife();
		User user = new User();
		user.setName("Kylin Soong");
		user.setEvents(events);
		user.setEvents(events);
		user.setFriends(friends);
		user.setIsMale(Boolean.TRUE);
		user.setUserCard(userCard);
		user.setCreatedDate(Calendar.getInstance());
		user.setWife(wife);
		
		return user;
	}

	private static Wife getWife() {
		UserCard userCard = new UserCard();
		userCard.setCardNumber("Wife usercard number");
		List<Pet> pets = getPetList();
		Wife wife = new Wife();
		wife.setName("Bitch Soong");
		wife.setUserCard(userCard);
		wife.setPets(pets);
		return wife;
	}

	private static List<Pet> getPetList() {
		List<Pet> pets = new ArrayList<Pet>();
		Pet p1 = new Pet();
		p1.setName("dog 1");
		p1.setProperties(getPropertyList(p1.getName()));
		Pet p2 = new Pet();
		p2.setName("dog 2");
		p2.setProperties(getPropertyList(p2.getName()));
		pets.add(p2);
		pets.add(p1);
		return pets;
	}

	private static List<Friend> getFriendList() {
		List<Friend> friends = new ArrayList<Friend>();
		Friend f1 = new Friend();
		f1.setName("friend1");
		UserCard uc1 = new UserCard();
		uc1.setCardNumber("friend1-usercard-number");
		f1.setUserCard(uc1);
		
		Friend f2 = new Friend();
		f2.setName("friend2");
		UserCard uc2 = new UserCard();
		uc2.setCardNumber("friend2-usercard-number");
		f2.setUserCard(uc2);
		friends.add(f1);
		friends.add(f2);
		return friends;
	}

	private static List<Event> getEventList() {
		List<Event> events = new ArrayList<Event>();
		Event e = null;
		e = new Event();
		e.setName("Cool");
		e.setProperties(getPropertyList(e.getName()));
		events.add(e);
		e = new Event();
		e.setName("Hot");
		e.setProperties(getPropertyList(e.getName()));
		events.add(e);
		e = new Event();
		e.setName("Cold");
		e.setProperties(getPropertyList(e.getName()));
		events.add(e);
		
		return events;
	}

	private static List<Property> getPropertyList(String name) {
		List<Property> props = new ArrayList<Property>();
		Property p1 = new Property();
		p1.setName(name + " property 1");
		Property p2 = new Property();
		p2.setName(name + " property 2");
		props.add(p1);
		props.add(p2);
		return props;
	}

}

 

这时一条数据插入到数据库,

到此词例子结束,接下来的一些测试全基于此例子

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制问题,并提供完整的Matlab代码实现。文章结合数据驱动方法与Koopman算子理论,利用递归神经网络(RNN)对非线性系统进行建模与线性化处理,从而提升纳米级定位系统的精度与动态响应性能。该方法通过提取系统隐含动态特征,构建近似线性模型,便于后续模型预测控制(MPC)的设计与优化,适用于高精度自动化控制场景。文中还展示了相关实验验证与仿真结果,证明了该方法的有效性和先进性。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事精密控制、智能制造、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能控制设计;②为非线性系统建模与线性化提供一种结合深度学习与现代控制理论的新思路;③帮助读者掌握Koopman算子、RNN建模与模型预测控制的综合应用。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现流程,重点关注数据预处理、RNN结构设计、Koopman观测矩阵构建及MPC控制器集成等关键环节,并可通过更换实际系统数据进行迁移验证,深化对方法泛化能力的理解。
<think> 我们面对的问题是Maven无法找到指定的jar包(com.cestccore.dz:base-core-jpa-dz:jar:0.0.1-20210819.080855-31-dz),并且错误信息显示它尝试从本地路径(D:\dev\code\zhongguodianzi\jianglingmg\dportal\service-sso\lib\base-core-jpa-0.0.1-20210819.080855-31.jar)获取,但显然这个jar包不在Maven的默认仓库中。同时,用户尝试使用`-U`标志强制更新快照,但问题依旧。 根据问题描述,这个依赖是一个快照版本(SNAPSHOT),并且被放置在项目的lib目录下(即本地文件系统)。在之前的回答中,我们提到过如何引入本地jar包。但是这里Maven报错,可能是因为依赖声明的方式不正确或者路径问题。 ### 解决步骤: #### 1. 确认依赖声明方式 在Maven项目中,如果使用本地jar包(不在Maven仓库中),我们需要在`pom.xml`中使用`system`作用域并指定`systemPath`。检查依赖声明是否如下: ```xml <dependency> <groupId>com.cestccore.dz</groupId> <artifactId>base-core-jpa-dz</artifactId> <version>0.0.1-20210819.080855-31-dz</version> <scope>system</scope> <systemPath>${project.basedir}/lib/base-core-jpa-0.0.1-20210819.080855-31.jar</systemPath> </dependency> ``` 注意: - `groupId`,`artifactId`,`version`必须与jar包的文件名匹配(虽然文件名中的版本号可能略有不同,但通常我们按照约定,文件名应该是`artifactId-version.jar`,这里版本号中的`-dz`在文件名中可能没有,所以需要检查实际文件名)。 - `systemPath`中的路径必须正确指向jar文件。这里使用了`${project.basedir}`表示项目根目录,然后进入`lib`目录,找到对应的jar包。 #### 2. 检查jar包的实际位置和文件名 根据错误信息,jar包路径是:`D:\dev\code\zhongguodianzi\jianglingmg\dportal\service-sso\lib\base-core-jpa-0.0.1-20210819.080855-31.jar`。 请确认: - 项目根目录下的`lib`文件夹确实存在该jar包。 - 在`pom.xml`中`systemPath`里写的文件名必须与实际文件名完全一致(包括版本号)。 如果实际文件名是`base-core-jpa-0.0.1-20210819.080855-31.jar`,那么依赖声明中的`version`应该是`0.0.1-20210819.080855-31`(注意,没有后面的`-dz`)。因为jar文件名中不包含`-dz`。但是,依赖声明中的`artifactId`和`version`组合应该与文件名匹配。通常,Maven会按照以下规则生成文件名:`<artifactId>-<version>.jar`。 所以,如果jar文件名为`base-core-jpa-0.0.1-20210819.080855-31.jar`,则: - `artifactId`应为`base-core-jpa`(注意,这里依赖声明中的`artifactId`是`base-core-jpa-dz`,这可能就是问题所在) - `version`应为`0.0.1-20210819.080855-31` 因此,有两种可能: - 依赖声明中的`artifactId`写错了,应该去掉`-dz`,即`base-core-jpa`。 - 或者,实际上jar包的文件名应该是`base-core-jpa-dz-0.0.1-20210819.080855-31.jar`,但是目前它是`base-core-jpa-0.0.1-20210819.080855-31.jar`(没有`-dz`)。 请根据实际情况调整依赖声明中的`artifactId`和`version`,或者重命名jar包,使之一致。 #### 3. 使用`-U`参数更新快照 快照版本(SNAPSHOT)在Maven中具有特殊性,Maven会定期检查远程仓库是否有更新的快照。但是,由于这个jar包是本地文件,不在远程仓库,所以使用`-U`参数并不会影响它。因此,这个参数对于解决这个问题没有帮助。 #### 4. 重新加载Maven项目 在修改`pom.xml`后,需要重新加载Maven项目,让IDE识别更改。如果使用命令行,可以执行: ```bash mvn clean install ``` #### 5. 如果上述步骤无效,考虑将jar包安装到本地Maven仓库 如果路径和依赖声明都正确,但问题仍然存在,可以考虑将这个jar包安装到本地Maven仓库,然后使用标准的依赖声明(去掉`system`作用域)。 安装命令: ```bash mvn install:install-file -Dfile=lib/base-core-jpa-0.0.1-20210819.080855-31.jar -DgroupId=com.cestccore.dz -DartifactId=base-core-jpa -Dversion=0.0.1-20210819.080855-31 -Dpackaging=jar ``` 注意:这里使用`base-core-jpa`作为`artifactId`(因为文件名中如此)。如果希望使用`base-core-jpa-dz`作为`artifactId`,那么需要修改`-DartifactId`参数,同时建议将jar包重命名为`base-core-jpa-dz-0.0.1-20210819.080855-31.jar`,再执行安装。 安装完成后,在`pom.xml`中改为: ```xml <dependency> <groupId>com.cestccore.dz</groupId> <artifactId>base-core-jpa</artifactId> <!-- 或者 base-core-jpa-dz,根据安装时指定的artifactId --> <version>0.0.1-20210819.080855-31</version> </dependency> ``` 这样,Maven就会从本地仓库中找到这个jar包。 ### 总结 1. **检查依赖声明和实际jar包的文件名是否匹配**(重点检查`artifactId`和`version`在文件名中的体现)。 2. **确保`systemPath`路径正确**,使用绝对路径或`${project.basedir}`。 3. **如果问题依旧,将jar包安装到本地Maven仓库**,然后使用标准依赖声明。 ### 相关问题 §§相关问题§§ 1. 如何正确在Maven项目中引入本地jar包? 2. Maven依赖声明中`groupId`、`artifactId`和`version`的命名规范是什么? 3. 如何将本地jar包安装到Maven本地仓库? 4. 使用`system`作用域引入依赖有哪些注意事项? </think>### 解决 Maven 无法找到指定 JAR 包的问题 #### 问题分析 当 Maven 报错 `Could not find artifact com.cestccore.dz:base-core-jpa-dz:jar:0.0.1-20210819.080855-31-dz` 时,通常有以下几个原因: 1. **依赖未正确安装到本地仓库** 2. **远程仓库未配置或不可访问** 3. **快照版本更新策略问题** 4. **本地 JAR 路径引用错误** #### 解决方案 ##### 1. 强制更新快照依赖(基础步骤) ```bash mvn clean install -U ``` - `-U` 参数强制更新所有快照依赖 - 适用于快照版本(含 `SNAPSHOT` 的版本号) ##### 2. 手动安装本地 JAR 到 Maven 仓库 如果依赖在本地路径 `D:\dev\code\...\lib\base-core-jpa-xxx.jar`,需手动安装: ```bash mvn install:install-file \ -Dfile=D:\dev\code\zhongguodianzi\jianglingmg\dportal\service-sso\lib\base-core-jpa-0.0.1-20210819.080855-31.jar \ -DgroupId=com.cestccore.dz \ -DartifactId=base-core-jpa-dz \ -Dversion=0.0.1-20210819.080855-31-dz \ -Dpackaging=jar \ -DgeneratePom=true ``` ##### 3. 检查 POM 依赖声明 确保 `pom.xml` 中的依赖声明与 JAR 文件名匹配: ```xml <dependency> <groupId>com.cestccore.dz</groupId> <artifactId>base-core-jpa-dz</artifactId> <!-- 版本号需与文件名中的版本段一致 --> <version>0.0.1-20210819.080855-31-dz</version> </dependency> ``` ##### 4. 配置远程仓库(若适用) 若依赖来自私有仓库,在 `pom.xml` 或 `settings.xml` 中添加: ```xml <repositories> <repository> <id>your-repo-id</id> <url>http://your-repo-url</url> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> </snapshots> </repository> </repositories> ``` ##### 5. 清理 Maven 本地仓库缓存 1. 删除本地仓库中的对应目录: ``` rm -rf ~/.m2/repository/com/cestccore/dz/base-core-jpa-dz ``` 2. 重新执行 `mvn install -U` ##### 6. 验证依赖是否存在 检查本地仓库路径: ``` ~/.m2/repository/com/cestccore/dz/base-core-jpa-dz/0.0.1-20210819.080855-31-dz/ ``` 应包含以下文件: ``` base-core-jpa-dz-0.0.1-20210819.080855-31-dz.jar base-core-jpa-dz-0.0.1-20210819.080855-31-dz.pom ``` #### 常见错误排查 | 错误现象 | 解决方案 | |---------|----------| | `Could not find artifact` | 检查 groupId/artifactId/version 是否与 JAR 文件名匹配 | | `Missing artifact` | 执行 `mvn dependency:resolve` 验证依赖树 | | 快照版本不更新 | 在 `settings.xml` 中添加 `<updatePolicy>always</updatePolicy>` | | 私有仓库访问失败 | 检查仓库 URL 和认证配置 | > **重要提示**:对于企业级项目,建议将专用 JAR 部署到 Nexus 私有仓库,避免本地路径依赖[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值