Java 9中项目Jigsaw的主要目标之一是可靠配置。也就是说,Java 9承诺解决类路径机制缺陷,允许 java 启动程序运行程序,而不确保所有必需的类都可用于在运行时加载,这曾经导致{{ 1}}秒。
这是通过在java.lang.NoClassDefFoundError
和全新的module-info.java
选项中声明模块依赖关系来完成的。在启动Java应用程序之前分析模块图。
但是,我仍然可以做到以下几点。
--module-path
和com.spacey.explorer
。 com.spacey.rocket
使用由com.spacey.explorer
模块定义和导出的类com.spacey.rocket.RocketZ
。在编译和JARing两个模块后,一切都正常运行。com.spacey.rocket
模块中删除com.spacey.rocket.RocketZ
类型,并重新编译并重新JAR只有这一个模块。com.spacey.rocket
模块运行以前编译的com.spacey.explorer
模块。com.spacey.rocket
,这可能需要4小时的应用程序正常运行时间。有没有办法真的确保在运行Java应用程序时不仅验证了模块图(模块路径)的完整性,而且还完成了对实际类型可访问性的全面检查?
答案 0 :(得分:5)
有没有办法真的确保在运行Java应用程序时不仅验证了模块图(模块路径)的完整性,还对实际类型的可访问性进行了全面检查?
不在JVM中,没有。模块系统在工件级别上运行,并且如果工件声称是正确的模块is present则很高兴。除此之外,不再进行进一步的检查。
那就是说,JDeps应该可以帮助你。它分析您的项目及其依赖项,并在各个类的级别上运行。它将指出无法找到的依赖项。
在你的例子中:
private void bgwInsertStudent_DoWork(object sender, DoWorkEventArgs e)
{
List<object> arg = (List<object>)e.Argument;
bool found = false;
using (OleDbConnection cnn = new OleDbConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString))
{
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.CommandText = "select top 1 * from [student info] where id=@id";
cmd.Connection = cnn;
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@id", arg[0].ToString());
cnn.Open();
using (OleDbDataReader rdr = cmd.ExecuteReader())
{
rdr.Read();
if (rdr.HasRows)
{
found = true;
}
cnn.Close();
}
}
using(OleDbCommand cmd=new OleDbCommand())
{
if(found)
{
MessageBox.Show("Student ID already inserted.");
}
else
{
cmd.CommandText = "insert into [Student info] values(@id, @firstname, @lastname, @department, @address)";
cmd.Connection = cnn;
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@id", arg[0].ToString());
cmd.Parameters.AddWithValue("@firstname", arg[1].ToString());
cmd.Parameters.AddWithValue("@lastname", arg[2].ToString());
cmd.Parameters.AddWithValue("@department", arg[3].ToString());
cmd.Parameters.AddWithValue("@address", arg[4].ToString());
cnn.Open();
cmd.ExecuteNonQuery();
cnn.Close();
MessageBox.Show("Record inserted!");
this.DialogResult = DialogResult.OK;
}
}
}
}
答案 1 :(得分:3)
我认为另一个答案有助于技术方面,但除此之外,我认为你的可靠部分有点不对劲。
This谈论脆弱的类路径:
所有这些都是脆弱的类路径的结果。这意味着ClassLoaders没有一个很好的机制来区分一个加载的类和另一个同名的类,或者用一个ClassLoader加载的类与另一个加载的类隔离。
模块为此提供的答案:
Java模块将提供可靠的配置和强大的封装。如果您有不兼容性,您将在构建时发现这些内容,而不是在应用程序开始在生产环境中运行后的某些不确定时间。
换句话说:我认为假设模块的设计是为了防止所有种LinkageError(所有No..FoundError内容的母亲),这是一种误解。 。模块使您更容易构建事物。您找到了一个很好的例子,它不一定会转化为关于运行时问题的完美安全网。
换句话说:您对“可靠模块”的解释与Jigsaw实际尝试提供的“可靠模块”的承诺不同步。