Java 9

时间:2017-09-27 22:06:28

标签: java java-9

Java 9中项目Jigsaw的主要目标之一是可靠配置。也就是说,Java 9承诺解决类路径机制缺陷,允许 java 启动程序运行程序,而不确保所有必需的类都可用于在运行时加载,这曾经导致{{ 1}}秒。

这是通过在java.lang.NoClassDefFoundError和全新的module-info.java选项中声明模块依赖关系来完成的。在启动Java应用程序之前分析模块图。

但是,我仍然可以做到以下几点。

  1. 假设我有两个模块--module-pathcom.spacey.explorercom.spacey.rocket使用由com.spacey.explorer模块定义和导出的类com.spacey.rocket.RocketZ。在编译和JARing两个模块后,一切都正常运行。
  2. 现在我从com.spacey.rocket模块中删除com.spacey.rocket.RocketZ类型,并重新编译并重新JAR只有这一个模块。
  3. 我使用新编译的com.spacey.rocket模块运行以前编译的com.spacey.explorer模块。
  4. 我得到了...... com.spacey.rocket,这可能需要4小时的应用程序正常运行时间。
  5. 有没有办法真的确保在运行Java应用程序时不仅验证了模块图(模块路径)的完整性,而且还完成了对实际类型可访问性的全面检查?

2 个答案:

答案 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实际尝试提供的“可靠模块”的承诺不同步。